2010-10-17 5 views
0

Désolé de doubler ma question précédente, mais j'ai pensé à demander des données spécifiques qui permettraient de résoudre le problème. Je veux que ce résultatCôté gauche de l'affectation avec des générateurs infinis

tuple_of_vars = (item for _, item for zip(tuple_of_vars, new_vals_generator)) 

que cela est impossible

a, b, c, d = (val for val in infite_generator) 

fait alors je veux faire dans une seule ligne

for var in var_list: 
    var = next(infinite_generator) 

Y at-il crochet d'interprète pour prendre métainformations du nombre de vars à gauche de l'assignation? Mieux serait cependant que je pourrais faire automatiquement ce dernier bit de code (y compris les cas avec le côté gauche qui tranche avec les index variables et l'étape)

Aussi est-il moyen de faire générateur de variables qui seraient laissés côté des mains de affectation.

EDIT: Cela ne se limite pas à python3:

def incr(a): 
    while True: 
     yield a 
     a += 1 


a = [None for i in range(20)] 

a[3:3:3], *_ = incr(1) 

print(a) 

Même avec:

a,b,c,d, *_ = incr(1) 

print(a, b, c, d) 

Même il n'a pas trancher (en fait les indices seraient des variables, c'est le test uniquement). Je suis conscient de islice etc mais c'est trop lent.

Ce produit aussi erreur:

a = 1000*[True] 

bound = int(len(a) ** 0.5) 

for i in range(3, bound, 2): 
    a[3::i], *x = [[False] for _ in range(bound)] 

""" Error: 
ValueError: attempt to assign sequence of size 1 to extended slice of size 333 
""" 

Et ceci:

a = 1000*[True] 

bound = int(len(a) ** 0.5) 

for i in range(3, bound, 2): 
    a[3::i], *x = [False] * bound 

""" Error: 
TypeError: must assign iterable to extended slice 
""" 

Répondre

1

Lorsque vous connaissez la longueur de var_list, vous pourriez use itertools.islice de couper le générateur infini:

>>> import itertools 
>>> infgen = itertools.cycle([1,4,9]) 
>>> a,b,c,d = itertools.islice(infgen, 4) 
>>> a,b,c,d 
(1, 4, 9, 1) 

Cela fonctionne aussi pour l'affectation à une tranche de liste.

>>> lst = [0]*20 
>>> lst[2:10:2] = itertools.islice(infgen, 4) 
>>> lst 
[0, 0, 4, 0, 9, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
+0

Oh, on dirait que je devrais dire à psyco et Python 2 unicode et passer à autre chose! Mais qu'en est-il de la tranche à gauche? 'my_slice [a: b: c], * _'? Je reçois une syntaxe invalide. –

+0

@Tony: Vous devez utiliser 'islice' pour cela (fonctionne aussi pour Python 2.x). – kennytm

+0

Le nombre de valeurs n'est pas connu à l'avance, car il est dynamique par variables. –

Questions connexes