У меня есть список кортежей кортежей, как показано ниже:
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
Однако это не работает.
Любая помощь в этом отношении будет оценена.
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]]
Использование 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)]]
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.