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