2016-11-07 24 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:另外,如果实际代码将文件读入字符串列表中,请考虑使用生成这些内容的生成器,而不必将所有内容都保存在内存中。 –

相关问题