2011-12-18 10 views
10

ho due generatori G1 e G2Come aderire/unire uscita due generatori utilizzando pitone

for line in g1: 
    print line[0] 

[a, a, a]
[b, b, b]
[c, c, c]

for line1 in g2: 
    print line1[0] 

[1, 1, 1]
[2, 2, 2]
[3, 3, 3]

for line in itertools.chain(g1, g2): 
    print line[0] 

[a, a, a]
[b, b, b]
[c, c, c]
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]


Come

posso ottenere l'output del tipo:

[a, a, a], [1, 1, 1]
[b, b, b], [2, 2, 2]
[c, c, c], [3, 3, 3]

o

[a, a, a, 1, 1, 1]
[b, b, b, 2, 2, 2]
[c, c, c, 3, 3, 3]


Grazie per il vostro aiuto.

risposta

12

primo caso: utilizzare

for x, y in zip(g1, g2): 
    print(x[0], y[0]) 

secondo caso: utilizzare

for x, y in zip(g1, g2): 
    print(x[0] + y[0]) 

si può ovviamente utilizzare itertools.izip per la versione del generatore. Si ottiene automaticamente il generatore se si utilizza zip in Python 3 e versioni successive.

+0

Grazie! Sto ripetendo contemporaneamente un elenco e un generatore. È bello sapere che non sto sprecando il mio generatore. – madtyn

3

È possibile ottenere coppie di cose (la prima richiesta) utilizzando zip(g1, g2). Puoi unirti a loro (la tua seconda richiesta) facendo [a + b for a, b in zip(g1, g2)].

Quasi allo stesso modo, è possibile utilizzare map. Utilizzare map(None, g1, g2) per produrre un elenco di coppie e map(lambda x, y: x + y, g1, g2) per unire le coppie.

Nei tuoi esempi, i tuoi generatori producono ogni volta una lista o una tupla, di cui sei interessato solo al primo elemento. Vorrei solo generare la cosa che ti serve, o pre-elaborarli prima di zipparli o mapparli. Ad esempio:

g1 = (g[0] for g in g1) 
g2 = (g[0] for g in g2) 

In alternativa, è possibile applicare [0] sulla mappa.Ecco i due casi:

map(lambda x, y: (x[0], y[0]), g1, g2) 
map(lambda x, y: x[0] + y[0], g1, g2) 
+0

Hai perso il '[0]' negli esempi. –

+0

@Ignacio grazie, risolto. –

+0

come va la memoria con generatori senza fine? che ne dici di usare izip? – joaquin

3

È possibile utilizzare itertools.izip ad esempio

g1=([s]*3 for s in string.ascii_lowercase) 
g2=([s]*3 for s in string.ascii_uppercase) 
g=itertools.izip(g1,g2) 

Ciò garantirà la risultante è anche un generatore.

Se si preferisce utilizzare la seconda ecco come si può fare

g1=([s]*3 for s in string.ascii_lowercase) 
g2=([s]*3 for s in string.ascii_uppercase) 
g=(x+y for x,y in itertools.izip(g1,g2)) 
+0

Grazie mille per la soluzione! – daikini

2

Diciamo avete g1 e g2:

g1 = [ 
    [['a', 'a', 'a'], ['e', 'e'], ['f', 'g']], 
    [['b', 'b', 'b'], ['e', 'e'], ['f', 'g']], 
    [['c', 'c', 'c'], ['e', 'e'], ['f', 'g']], 
] 

g2 = [ 
    [[1, 1, 1], ['t', 'q'], ['h', 't']], 
    [[2, 2, 2], ['r', 'a'], ['l', 'o']], 
    [[3, 3, 3], ['x', 'w'], ['z', 'p']], 
] 

per ottenere che:

[a, a, a],[1, 1, 1] 
[b, b, b],[2, 2, 2] 
[c, c, c],[3, 3, 3] 

È possibile farlo:

result1 = map(lambda a, b: (a[0], b[0]) , g1, g2) 
# Which is like this : 
[(['a', 'a', 'a'], [1, 1, 1]), 
(['b', 'b', 'b'], [2, 2, 2]), 
(['c', 'c', 'c'], [3, 3, 3])] 

E per la seconda:

[a, a, a, 1, 1, 1] 
[b, b, b, 2, 2, 2] 
[c, c, c, 3, 3, 3] 

result2 = map(lambda a, b: a[0]+b[0] , g1, g2) 
# Which is like that : 
[['a', 'a', 'a', 1, 1, 1], 
['b', 'b', 'b', 2, 2, 2], 
['c', 'c', 'c', 3, 3, 3]] 
+0

Grazie mille per l'aiuto – daikini

Problemi correlati