Mam dwa generatory G1 i G2

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]


.. W jaki sposób

Czy dostaję wyjście:

[A, A, A], [1, 1, 1]
[b, b, b], [2, 2, 2]
[C, C, C], [3, 3, 3]

lub
.

[A, A, A, 1, 1, 1]
[b, b, b, 2, 2, 2]
[C, C, C, 3, 3, 3]


.. Dziękujemy za pomoc.

13
daikini 18 grudzień 2011, 21:15

4 odpowiedzi

Najlepsza odpowiedź

Pierwszy przypadek: Użyj

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

Druga sprawa: użyj

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

Możesz oczywiście użyć itertools.izip dla wersji generatora. Otrzymujesz generator automatycznie, jeśli używasz zip w Pythonie 3 i większy.

16
black panda 18 grudzień 2011, 17:47

Możesz użyć ittools.izip na przykład

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

Zapewni to wynikowy jest również generator.

Jeśli wolisz użyć drugiego tutaj, jest jak możesz to zrobić

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))
4
Abhijit 18 grudzień 2011, 17:32

Możesz zdobyć pary rzeczy (pierwszej prośby) za pomocą zip(g1, g2). Możesz do nich dołączyć (drugie żądanie), robiąc [a + b for a, b in zip(g1, g2)].

Prawie równoważnie można użyć map. Użyj map(None, g1, g2), aby uzyskać listę par, a map(lambda x, y: x + y, g1, g2), aby połączyć pary razem.

W przykładach generatory produkują listę lub krotkę za każdym razem, z których jesteś zainteresowany tylko pierwszym elementem. Właśnie wygeneruję coś, czego potrzebujesz lub przedostawał je przed załamaniem lub odwzorowanie ich. Na przykład:

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

Alternatywnie możesz zastosować [0] na mapie. Oto dwa przypadki:

map(lambda x, y: (x[0], y[0]), g1, g2)
map(lambda x, y: x[0] + y[0], g1, g2)
3
18 grudzień 2011, 17:29

Powiedzmy, że masz g1 i 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']],
]

Zdobyć to:

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

Możesz to zrobić :

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])]

I na drugą:

[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]]
3
Stan 18 grudzień 2011, 17:43