2017-09-13 77 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

有道理。編輯答案,但它非常接近原始問題中的代碼。 –