2016-10-20 3 views
1

Я видел this и this вопросов, и я хотел был бы иметь такой же эффект, только эффективно с itertool.izip.Что такое обратная функция itertools.izip в python?

С itertool.izip «s документации:

Как молния() за исключением того, что она возвращает итератор вместо списка

Мне нужен итератор, потому что я не могу уместить все значения в память поэтому вместо этого я использую генератор и повторяю значения.

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

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

Я не могу придумать разумный способ генерации одного «списка значений» за раз, потому что иногда я могу удалить экземпляры трехзначного кортежа в зависимости от большого значения кортежа.

Использование широко предложенное zip решения, подобные:

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)]) 
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)] 

Результатов в «распаковке списка аргументов» часть (* [...]) этого вызвать полную итерацию по всему итератору и (Я предполагаю) кэшировать все результаты в памяти, что, как я уже сказал, проблема для меня.

Я могу создать список масок (True/False для сохранения небольших значений), но я ищу более чистый питонический путь. Если все остальное не удастся, я сделаю это.

+0

Значения 'data' могут входить в третью запись в 3-х кортеже, а более короткие списки - в первую и вторую, да? Можете ли вы описать, что должно произойти, когда эти более короткие списки исчерпаны? Предпочтительно дать явный пример, используя два очень коротких списка и немного более длинный. – barny

+0

@barny Списки, все из которых имеют одинаковую длину, я говорил о размере (то есть о требованиях к памяти) отдельных значений в списках. Значения данных слишком велики для хранения в памяти вместе. – NirIzr

+0

Фразинг действительно неясен, отредактирован. – NirIzr

ответ

2

Что не так с традиционной петлей?

>>> def gen(): 
...  yield 'first', 0, 1 
...  yield 'second', 2, 3 
...  yield 'third', 4, 5 
... 
>>> numbers = [] 
>>> for data, num1, num2 in gen(): 
...  print data 
...  numbers.append((num1, num2)) 
... 
first 
second 
third 
>>> numbers 
[(0, 1), (2, 3), (4, 5)] 
+0

Спасибо, это могло бы работать, но я передаю генератор данных в библиотечную функцию без контроля того, как она выполняет итерации над значениями, поэтому я не могу добавить другие значения в другие списки. – NirIzr

+0

@NirIzr - Создать обертку? – TigerhawkT3

+0

Да, спасибо! Не знаю, как я это пропустил. – NirIzr

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