2016-11-07 4 views
-1

Как я смутно понимаю, itertools.chain.from_iterable предназначен для объединения двух или более вещей, возвращающих итерации, т. Е. Вещи, которые используют ключевое слово yield, и при их использовании как таковые они эффективны с точки зрения памяти.Содержит ли цепочка список какие-либо выгоды?

У меня есть этот код, который я пытаюсь расшифровать. Кто-то написал это.

all_rows = [] 
with open(__file__, 'rt') as reader: 
    for row in reader: 
     all_rows.append(row) 
magic = list(itertools.chain.from_iterable(all_rows)) 
for line in magic: 
    print(line) 

Не было бы лучше просто использовать all_rows напрямую, поскольку это уже структура данных в памяти?

ответ

4

Вы не связываете один список. Вы Цепочка содержимом из этого списка:

>>> import itertools 
>>> all_rows = ['lorem ipsum', 'and so on'] 
>>> list(itertools.chain.from_iterable(all_rows)) 
['l', 'o', 'r', 'e', 'm', ' ', 'i', 'p', 's', 'u', 'm', 'a', 'n', 'd', ' ', 's', 'o', ' ', 'o', 'n'] 

Вы бы точку, если ваш код был просто используя chain(all_rows) вместо chain.from_iterable(all_rows); то вы абсолютно правы. Нет смысла связывать один итерабельный, который уже является списком, а затем снова преобразовать эту цепочку в список.

Но itertools.chain.from_iterable() function содержит содержание итерации и соединяет их вместе. Затем это зависит от элементов в списке.

Для вашего примера, связывая несколько строк, преимущество состоит в том, что вам не нужно сначала создавать более крупный список. В противном случае вам пришлось бы использовать list(''.join(all_rows)).

+0

Стреляйте, мой пример должен иметь ошибку. Во всяком случае, фактический код читается в файлах в список строк, а затем вызывает список (itertools.chain.from_iterable (all_rows)) перед итерацией по строкам в цикле for-in. – MatthewMartin

+0

@MatthewMartin: это звучит расточительно, зачем строить список при повторении в цикле? Если вам не нужен произвольный доступ, тогда не вызывайте 'list()' на этом и просто итетерируйте. –

+0

@MatthewMartin: также, если фактический код читается в файлах в список строк, подумайте об использовании генератора, который создает это содержимое вместо того, чтобы не хранить все в памяти. –