python itertools.tee - почему мои копии ведут себя так? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующий код:

# create an iterator
result = itertools.groupby(people, key=get_job)

# create copies
copy1, copy2, copy3, copy4, copy5 = itertools.tee(result, 5)

# run first copy
for key, group in copy1:
    print(key, list(group))

# run second copy
for key, group in copy2:
    print(key, list(group))

Что возвращается:

hacker [list here as expected]
banker [list here as expected]
trader [list here as expected]

hacker []
banker []
trader []

Итак, второй итератор не работает.

Я знаю, что итератор можно итерировать только один раз в python - но не стоит ли копировать именно для решения этой проблемы? Ie Я бы ожидал, что каждый копировать, чтобы иметь свою собственную жизнь, и иметь возможность перебирать ее независимо от того, перебрал ли я другие.

Либо мой код неверен, либо я неправильно понимаю цель копирования.

1 Ответ

0 голосов
/ 29 апреля 2020

После многих часов исследований я могу подтвердить, что приведенный выше @jasonharper был верным - вы не можете itertools.tee использовать вложенные итераторы, такие как .groupby.

Вместо этого я нашел рабочее решение здесь: Python itertools.groupby несколько значений

Скопируйте вставку оттуда, чтобы спасти любого, кто читает это время:

totalResults = [] 
totalClasses = []           
for key, location in groupby(rows, lambda k: k[0]):
    location = list(location)
    totalResults.append(dict(name=key, data=[x[2] for x in location]))
    totalClasses.append(dict(name=key, data=[x[3] for x in location]))

Все благодарности автору (@John La Rooy) там.

...