添加列表和迭代器以形成新列表
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
。
在python-3.5中,可以使用迭代解包:
call_function([<b>*</b>a_list, <b>*</b>iter(b_list)])
这有效于:
>>> [*a_list, *iter(b_list)]
[1, 2, 3, 4, 5]
请注意 a_list
和 iter(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))
我试过了:
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
。
在python-3.5中,可以使用迭代解包:
call_function([<b>*</b>a_list, <b>*</b>iter(b_list)])
这有效于:
>>> [*a_list, *iter(b_list)]
[1, 2, 3, 4, 5]
请注意 a_list
和 iter(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))