2015-12-04 2 views
-1

Почему следующий код возвращает два False пар?Проблема с itertools.groupby в Python

from itertools import groupby 

content = '1\t2\t3\n4\t5\t\n7\t8\t9' 

result = groupby((line.split('\t') for line in content.splitlines()), 
       key=lambda x: x[2] == '') 

for k, v in result: 
    print '--->', k, id(k) 
    print list(v) 

Результат, как показано следующее

---> False 505954168 
[['1', '2', '3']] 
---> True 505954192 
[['4', '5', '']] 
---> False 505954168 
[['7', '8', '9']] 
+0

Что вы ожидали? – vaultah

+0

Я ожидаю, что все элементы False находятся в одной группе – Jacky

+1

Словарь будет способом группировки, groupby работает только для упорядоченных данных –

ответ

4

itertools.groupby

делает итератора, который возвращает последовательные ключи и группы из итерацию. ... Он генерирует разрыв или новую группу каждый раз, когда изменяется значение ключевой функции (поэтому, как правило, необходимо сортировать данные, используя одну и ту же ключевую функцию).

Акцент добавлен.

Вам нужно сортировать Ваш вход

genexp = (line.split('\t') for line in content.splitlines()) 
key = lambda x: x[2] == '' 

result = groupby(sorted(genexp, key=key), key=key) # Note: same key function 

или написать свою собственную функцию группирования. Честно говоря, это не так сложно:

from collections import defaultdict 
dd = defaultdict(list) 
for x in genexp: 
    dd[key(x)].append(x) 
result = dd.items() 
+0

dicts также более эффективны, чем сортировка –

Смежные вопросы