添加列表和迭代器以形成新列表

Add a list and an iterator to form a new list

我试过了:

a_list = [1,2,3]
b_list = [4,5]
...

call_function(a_list + iter(b_list))  # TypeError

还有比这更好的代码吗:

a_list = [1,2,3]
b_list = [4,5]
...

new_list = a_list[:]
new_list += iter(b_list)  # no TypeError?
call_function(new_list)

考虑任何迭代器,我使用 islice 代替 iter

中,可以使用迭代解包:

call_function([<b>*</b>a_list, <b>*</b>iter(b_list)])

这有效于:

>>> [*a_list, *iter(b_list)]
[1, 2, 3, 4, 5]

请注意 a_listiter(b_list) 前面的星号 (*)。此外 a_list 只需要是 finite iterable/iterator。因此,您可以简单地构造一个将有限可迭代对象连接在一起的列表。

您可以通常使用itertools.chain加入迭代:

from itertools import chain

new_list = list(chain(a_list, iter(b_list))) 
print(new_list)
# [1, 2, 3, 4, 5]

现有的答案已经解决了解决方法。此外,这一行:

new_list += iter(b_list)

不会抛出错误,因为它调用了支持添加迭代器的list.__iadd__

您可以使用 __iadd__(),它是由语法糖 += 触发的真正函数(这就是它不会产生错误的原因)。

call_function(a_list.__iadd__(iter(b_list)))

生产

>>> a_list.__iadd__(iter(b_list))
[1, 2, 3, 4, 5]

这很有趣,但说实话,就可读性而言并不是很好。更喜欢其他答案:)

编辑:

当然要生成 new_list,你必须复制 list_a 你在问题中做了什么。

a_list[:].__iadd__(iter(b_list))