2016-11-07 45 views
-1

正如我對它的理解一樣,itertools.chain.from_iterable用於組合兩個或更多返回iterables的東西,即使用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

您不鏈接一個列表。如果你的代碼是簡單地使用chain(all_rows)代替chain.from_iterable(all_rows)

>>> 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'] 

你就會有一個點;:您要串聯的內容該列表的那麼你是絕對正確的。鏈接已經是列表的單個迭代沒有意義,然後再將該鏈轉換爲列表。

itertools.chain.from_iterable() function需要內容一個迭代,並鏈接在一起。然後它取決於列表中的元素。

對於你的例子,鏈接多個字符串,好處是你不必先建立一個更大的列表。否則,您必須使用list(''.join(all_rows))

+0

拍攝,我的例子必須有一個錯誤。無論如何,實際代碼將文件讀入字符串列表,然後調用list(itertools.chain.from_iterable(all_rows)),然後在for-in循環中遍歷行。 – MatthewMartin

+0

@MatthewMartin:這聽起來很浪費,爲什麼在迭代循環時建立一個列表?如果你不需要隨機訪問,那麼不要調用'list()',只是迭代。 –

+0

@MatthewMartin:另外,如果實際代碼將文件讀入字符串列表中,請考慮使用生成這些內容的生成器,而不必將所有內容都保存在內存中。 –

相關問題