Python itertools groupby многократного использования в понимании списка - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь сделать что-то подобное:

groups = groupby(all_data, key=itemgetter(1))
result = []
for k,g in groups:
    gg = list(g)
    count = len(gg)
    v = gg[0][3:] #No empty groups, right?
    hosts = ";".join([x[0] for x in gg])
    result.append(v + (count,) + (hosts,))

Я ненавижу петли. ;) Есть ли шанс сделать это с пониманием? Проблема в том, что это итератор, а не список, и я понятия не имею, как я могу преобразовать его в список в понимании.

1 Ответ

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

Нет необходимости или значительного преимущества в преобразовании этого в понимание списка. У вас может остаться нечитаемый код, понятный только вам.

Один стилистический момент, который я поддерживаю, - не создавать списки преждевременно или излишне. Это оставляет параметр открытым для итерации результатов, а не для создания списка, содержащего все результаты.

Например:

from itertools import groupby
from operator import itemgetter

all_data = [('A', 'B', 'C', 'S', 'T'),
            ('E', 'B', 'C', 'U', 'V'),
            ('H', 'I', 'J', 'W', 'X')]

groups = groupby(all_data, key=itemgetter(1))

def fun(groups):
    for _, g in groups:
        gg = list(g)
        hosts = ';'.join(list(map(itemgetter(0), gg)))
        yield gg[0][3:] + (len(gg),) + (hosts,)

res = list(fun(groups))

[('S', 'T', 2, 'A;E'),
 ('W', 'X', 1, 'H')]
...