2017-09-13 3 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) 

は、任意のイテレータを考えてみましょう、私が代わりにisliceを使用していますiter

+1

なぜnew_list = a_list + b_listですか? –

+1

最後の行を参照してください – Adam

+1

@BearBrown: 'b_list'は、iterable/iteratorを構築するためにのみ使用されています... Afaikでは、それをblackbox iterable/iteratorとして見てください。 –

答えて

4

では、反復可能でを開梱使用することができます:a_listiter(b_list)両方の目の前で

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

お知らせアスタリスク(*):

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

これは、以来、動作します。さらにa_listは、有限の iterable/iteratorである必要があります。したがって、有限のiterableを連結したリストを作成するだけです。

3

あなたは一般使用itertools.chainは反復可能オブジェクトに参加することができます。

from itertools import chain 

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

既存の答えはすでに回避策に取り組みます。また、この行:それはイテレータの追加をサポートするlist.__iadd__を呼び出すため

new_list += iter(b_list) 

は、エラーをスローしません。

1

構文砂糖+=の実際の機能トリガーである__iadd__()を使用できます(そのため、エラーは発生しません)。

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

プロデュース

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

これは正直に言うのは楽しいが、読みやすさの点で本当に良いではありません。他の回答:)

EDIT好む:

もちろんnew_listを生成するが、あなたはlist_aのコピーは、あなたの質問にやっているようにする必要があります。

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

私は新しいリストを作成しようとしました。私は質問体でそれを指定しなかったが、 – Adam

+0

@Adamは理にかなっている。答えを編集しますが、元の質問のコードに非常に近いです。 –