web-dev-qa-db-fra.com

Est-il possible de convertir un type de liste en générateur sans itérer à travers?

Je sais qu'il est possible de convertir des générateurs en listes à un "bas niveau" (par exemple. list(i for i in xrange(10))), mais est-il possible de faire l'inverse sans en parcourant la liste en premier (par exemple. (i for i in range(10)))?

Edit: a supprimé le mot cast pour plus de clarté dans ce que j'essaie de réaliser.

Edit 2: En fait, je pense que j'ai peut-être mal compris les générateurs à un niveau fondamental. Cela m'apprendra à ne pas poster SO questions avant mon café du matin!

34

Essayez ceci: an_iterator = iter(a_list) ... docs here . Est-ce que c'est ce que tu veux?

53
John Machin

Vous pouvez retirer une liste d'un itérateur en utilisant la fonction intégrée list(...) et un itérateur d'une liste en utilisant iter(...):

mylist = list(myiterator)
myiterator = iter(mylist)

En effet, votre syntaxe est un itérateur:

iter_10 = (i for i in range(10))

à la place d'utiliser [...] qui donne une liste.

Jetez un oeil à cette réponse Fonctionnalités cachées de Python

14
Don

En effet, il est possible qu'une liste possède l'interface de l'itérateur:

list_iter = list.__iter__() # or iter(list), returns list iterator
list_iter.__next__() # list_iter.next() for python 2.x

Alors,

lst_iter = iter(lst)

fait l'affaire.

Bien qu'il soit plus logique d'utiliser des compréhensions et d'en faire un générateur: par ex.

lst_iter_gt_10 = (item for item in lst if item > 10)
7
Zaur Nasibov

Je ne suis pas sûr que vous vouliez dire, mais ce que vous avez tapé est valide Python:

>>> x = (i for i in range(10))
>>> x
<generator object at 0xb7f05f6c>
>>> for i in x: print i
0
1
2
3
4
5
6
7
8
9
4
tylerl