2017-09-13 4 views
4

J'ai essayé:Ajouter une liste et un itérateur pour former une nouvelle liste

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

call_function(a_list + iter(b_list)) # TypeError 

Y at-il un meilleur code que celui-ci:

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

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

Tenir compte tout iterator, j'utilise islice en place de iter.

+1

pourquoi pas 'new_list = a_list + b_list'? –

+1

s'il vous plaît voir la dernière ligne – Adam

+1

@BearBrown: le 'b_list' est seulement utilisé pour construire un iterable/itérateur ... Afaik vous devriez le voir comme un iterable/itérateur blackbox. –

Répondre

4

En , vous pouvez utiliser itérables déballage:

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

Cela fonctionne depuis:

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

Notez l'astérisque (*) devant les deux a_list et iter(b_list). En outre a_list doit seulement être un fini itératif/itérateur. Vous pouvez donc simplement construire une liste qui concatène des itérateurs finis ensemble.

3

Vous pouvez généralement utilisation itertools.chain rejoindre iterables:

from itertools import chain 

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

Les réponses existantes traitent déjà la solution de contournement. De plus, cette ligne:

new_list += iter(b_list) 

ne jette pas une erreur, car elle appelle list.__iadd__ qui prend en charge l'ajout de itérateurs.

1

Vous pouvez utiliser __iadd__() qui est la fonction réelle de déclenchement par le sucre syntaxique += (C'est pourquoi il ne crée pas une erreur).

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

Produce

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

C'est amusant mais pas vraiment bon en terme de lisibilité pour être honnête. Préférez les autres réponses :)

EDIT:

Bien sûr, pour produire new_list, vous devez faire une copie de list_a vous a fait dans votre question.

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

Je voulais former une nouvelle liste (en titre de question). Je ne l'ai pas spécifié dans le corps de la question, bien que – Adam

+0

@Adam ait un sens. Modifier la réponse, mais il est très proche du code dans votre question initiale. –