У меня есть список кортежей кортежей, как показано ниже:

x = [
    (('102', '393', 'abc'), 63),
    (('102', '393', 'ack'), 8),
    (('117', '393', 'bcx'), 57),
    (('390', '393', 'wff'), 41),
    (('393', '102', 'wer'), 40),
    (('393', '102', 'wfv'), 78),
    (('393', '117', 'iyy'), 7),
    (('393', '448', 'wec'), 25),
]

И я пытаюсь извлечь кортежи, в которых «((« 102 »,« 393 »,« abc »), 63) и« ((«102», «393», «ack»), 8), «в тот же маленький список

Итак, результат должен быть

[
  [ (('102', '393', 'abc'), 63), (('102', '393', 'ack'), 8)],
  [ (('117', '393', 'bcx'), 57)],
  [ (('390', '393', 'wff'), 41)],
  [ (('393', '102', 'wer'), 40), (('393', '102', 'wfv'), 78)],
  [ (('393', '117', 'iyy'), 7)],
  [ (('393', '448', 'wec'), 25)]
]

Я пытаюсь выполнить его в python с bubble_sort. Я пробовал это

for i in range(1, len(x)):
    for j in range(0, len(x)):
        if x[j][0] == x[j + 1][0] and x[j][1] == x[j + 1][1]:
            pass

Однако это не работает.

Любая помощь в этом отношении будет оценена.

0
eshel 17 Авг 2019 в 11:20

2 ответа

Лучший ответ

Вы можете попробовать использовать defaultdict / dict:

from pprint import pprint
from collections import defaultdict

x = [
    (('102', '393', 'abc'), 63),
    (('102', '393', 'ack'), 8),
    (('117', '393', 'bcx'), 57),
    (('390', '393', 'wff'), 41),
    (('393', '102', 'wer'), 40),
    (('393', '102', 'wfv'), 78),
    (('393', '117', 'iyy'), 7),
    (('393', '448', 'wec'), 25),
]

val = defaultdict(list)

for item in x: 
    val[item[0][0], item[0][1]].append(item)

pprint(list(val.values()))

Выход:

[[(('102', '393', 'abc'), 63), (('102', '393', 'ack'), 8)],
 [(('117', '393', 'bcx'), 57)],
 [(('390', '393', 'wff'), 41)],
 [(('393', '102', 'wer'), 40), (('393', '102', 'wfv'), 78)],
 [(('393', '117', 'iyy'), 7)],
 [(('393', '448', 'wec'), 25)]]

Если вы хотите взять только второй элемент из каждого элемента списка, после вышеописанной обработки:

pprint([[e[1] for e in i] for i in val.values()])

Выход:

[[63, 8], [57], [41], [40, 78], [7], [25]]
0
rusu_ro1 17 Авг 2019 в 09:16

Использование itertools.groupby (doc):

x = [
    (('102', '393', 'abc'), 63),
    (('102', '393', 'ack'), 8),
    (('117', '393', 'bcx'), 57),
    (('390', '393', 'wff'), 41),
    (('393', '102', 'wer'), 40),
    (('393', '102', 'wfv'), 78),
    (('393', '117', 'iyy'), 7),
    (('393', '448', 'wec'), 25),
]

from itertools import groupby

out = [[*g] for _, g in groupby(x, lambda k: (k[0][0], k[0][1]))]

from pprint import pprint
pprint(out)

Печать:

[[(('102', '393', 'abc'), 63), (('102', '393', 'ack'), 8)],
 [(('117', '393', 'bcx'), 57)],
 [(('390', '393', 'wff'), 41)],
 [(('393', '102', 'wer'), 40), (('393', '102', 'wfv'), 78)],
 [(('393', '117', 'iyy'), 7)],
 [(('393', '448', 'wec'), 25)]]
0
Andrej Kesely 17 Авг 2019 в 08:26