链接列表是否提供任何好处?

时间:2016-11-07 16:03:56

标签: python itertools

当我模糊地理解它时,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不是更好,因为它已经是内存数据结构吗?

1 个答案:

答案 0 :(得分: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))