iterator.groupby () не может генерировать правильный результат - PullRequest
0 голосов
/ 17 декабря 2018

Код:

import itertools
first_letter = lambda x: x[0]
names = ['Alan', 'Adam', 'Wes', 'Albert', 'Steven']
for letter, name in itertools.groupby(names, first_letter):
    print(letter, list(name))

Вывод:

A ['Alan', 'Adam']
W ['Wes']
A ['Albert']
S ['Steven']

Я хочу сгруппировать по первому элементу, но, похоже, это не работает, что здесь не так?

1 Ответ

0 голосов
/ 17 декабря 2018

Как и следовало ожидать, любая форма в itertools, groupby работает с последовательностями элементов, которые имеют общий ключ.Вы должны помнить, что итератор может быть любым источником последовательных данных, возможно, тот, который не хранит, является собственными элементами, как делает список.

Это означает, что если данные еще не сгруппированы витератор, groupby не будет работать так, как вы ожидаете.Другими словами, groupby запускает другую группу при каждом изменении ключа, независимо от того, появился ли ключ в последовательности или нет.

Вероятно, самый простой способ предварительно сгруппировать данные в вашем случае - этосортировать это.Списки можно сортировать по месту:

names=['Alan','Adam','Wes','Albert','Steven']
<b>names.sort()</b>
for letter, name in itertools.groupby(names, first_letter):
    print( letter, list(name))

Аналогичный результат можно получить, распространив ваш список в словарь.Я использую collections.defaultdict ниже, потому что это облегчает добавление новых элементов.Вы можете использовать обычный словарь так же легко:

grouped = collections.defaultdict(list)
for name in names:
    grouped[name[0]].append(name)

for letter, group in grouped.items():
    print(letter, group)

В любом случае, смысл в том, что вы не можете ожидать, что groupby будет делать именно то, что вы хотите с порядком элементов в ваших необработанных данных.

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