Список кортежей в список списков с группировкой элементов - PullRequest
0 голосов
/ 16 октября 2018

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

start_list = [(A99, 2, 3 B1), (A21, 3, 4, B1), (A123, 4, 5, B2), (A22, 3 6, B2), (A12, 4, 6, B1)]

, и я хочу сгруппировать все кортежи с одинаковым последним элементом в списки вида:

result = [[B1, [A99, A21, A12]],[B2, [A123, A22]]]

Моя попытка:

for idx in range(len(start_list)):
        concat_list += [start_list[idx][0]]
        for idx2 in range(idx+1, len(start_list)):
            if start_list[idx][-1] == start_list[idx2][-1]:
                concat_list += [start_list[idx2][0]]

        grouped_list.append([start_list[idx][-1], concat_list])
        concat_list = []

    grouped_list = dict(((x[0]), x) for x in grouped_list).values()

Не учитываются все кортежи, а также не включаются все начальные элементы (A99, A123 ...) в соответствующий кортеж.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете попробовать что-то вроде этого:

from collections import defaultdict

d = defaultdict(lambda: [])
start_list = [('A99', 2, 3, 'B1'), ('A21', 3, 4, 'B1'), ('A123', 4, 5, 'B2'), ('A22', 3, 6, 'B2'), ('A12', 4, 6, 'B1')]

for elt in start_list:
    d[elt[3]].append(elt[0])

grouped_list = [[k, v] for k, v in d.items()]
0 голосов
/ 16 октября 2018

Вы можете использовать collections.defaultdict для решения O ( n ):

from collections import defaultdict

start_list = [('A99', 2, 3, 'B1'), ('A21', 3, 4, 'B1'), ('A123', 4, 5, 'B2'),
              ('A22', 3, 6, 'B2'), ('A12', 4, 6, 'B1')]

res = defaultdict(list)

for value, _, _, key in start_list:
    res[key].append(value)

Результат:

defaultdict(list, {'B1': ['A99', 'A21', 'A12'],
                   'B2': ['A123', 'A22']})

ЕслиВы не возражаете против tuple элементов, для вложенной структуры вы можете использовать:

res_lst = list(res.items())

[('B1', ['A99', 'A21', 'A12']), ('B2', ['A123', 'A22'])]

Или для получения точного желаемого результата используйте понимание списка:

res_lst = [[k, v] for k, v in res.items()]

[['B1', ['A99', 'A21', 'A12']], ['B2', ['A123', 'A22']]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...