Как и следовало ожидать, любая форма в 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
будет делать именно то, что вы хотите с порядком элементов в ваших необработанных данных.