Как сгруппировать список кортежей? - PullRequest
0 голосов
/ 31 мая 2018

Примечание : я знаю, как я могу сделать это, конечно, в явном цикле for, но я ищу решение, которое немного более читабельно.

Если возможно, я 'Я хотел бы решить эту проблему с помощью некоторых встроенных функций.В лучшем случае это что-то вроде

result = [ *groupby logic* ]

. Предполагается следующий список:

import numpy as np
np.random.seed(42)

N = 10

my_tuples = list(zip(np.random.choice(list('ABC'), size=N),
                     np.random.choice(range(100), size=N)))

, где my_tuples равно

[('C', 74),
 ('A', 74),
 ('C', 87),
 ('C', 99),
 ('A', 23),
 ('A', 2),
 ('C', 21),
 ('B', 52),
 ('C', 1),
 ('C', 87)]

Как группироватьиндексы (целочисленное значение в индексе 1 каждого кортежа) по меткам A, B и C, используя groupby из itertools?

Если я сделаю что-то вроде этого:

from itertools import groupby

#..

[(k,*v) for k, v in dict(groupby(my_tuples, lambda x: x[0])).items()]

Iвидите, что это дает неправильный результат.

Желаемый результат должен быть

{
  'A': [74, 23, 2],
  # ..
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

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

Использование itertools.groupby требует сортировки перед группировкой, возникающейO ( n log n ) сложность:

from itertools import groupby
from operator import itemgetter

sorter = sorted(my_tuples, key=itemgetter(0))
grouper = groupby(sorter, key=itemgetter(0))

res = {k: list(map(itemgetter(1), v)) for k, v in grouper}

print(res)

{'A': [74, 23, 2],
 'B': [52],
 'C': [74, 87, 99, 21, 1, 87]}
0 голосов
/ 31 мая 2018

Самое простое решение, вероятно, состоит в том, чтобы вообще не использовать groupby.

from collections import defaultdict

d = defaultdict(list)

for k, v in my_tuples:
    d[k].append(v)

Причина, по которой я бы не стал использовать groupby, заключается в том, что groupby(iterable) группирует элементы в iterable, которые находятся рядом,Таким образом, чтобы собрать все значения 'C', вам сначала нужно отсортировать список.Если у вас нет причин использовать groupby, это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...