2017-09-13 64 views
4

我想:添加列表和迭代器,形成一个新的列表

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) 

考虑任何迭代器,我在的地方使用isliceiter

+1

为什么不'new_list = a_list + b_list'? –

+1

请看最后一行 – Adam

+1

@BearBrown:'b_list'仅用于构造一个iterable/iterator ... Afaik你应该将它看作一个blackbox iterable/iterator。 –

回答

4

,你可以使用迭代拆包

call_function([*a_list, *iter(b_list)])

这工作,因为:在这两个a_listiter(b_list)

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

公告星号(*)。此外a_list只能是一个有限可迭代/迭代器。所以你可以简单地构造一个连接有限可迭代的列表。

3

可以一般使用itertools.chain加入iterables:

from itertools import chain 

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

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

new_list += iter(b_list) 

不会抛出一个错误,因为它调用list.__iadd__它支持除了迭代器。

1

您可以使用__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)) 
+0

我的意思是形成一个新的名单(问题标题)。我没有在问题主体中指定它,尽管@ Adam有 – Adam

+0

有道理。编辑答案,但它非常接近原始问题中的代码。 –