Как объединить / объединить вывод двух генераторов, используя python - PullRequest
13 голосов
/ 18 декабря 2011

У меня есть два генератора g1 и g2

for line in g1:
    print line[0]

[а, а, а]
[б, б, б]
[с, с, с]

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]

[а, а, а]
[б, б, б]
[с, с, с]
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]


Как

я получу вывод как:

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

или

[а, а, а, 1, 1, 1]
[b, b, b, 2, 2, 2]
[с, с, с, 3, 3, 3]


Спасибо за помощь.

Ответы [ 4 ]

14 голосов
/ 18 декабря 2011

первый случай: используйте

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

второй случай: используйте

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

Конечно, вы можете использовать itertools.izip для версии генератора. Вы получаете генератор автоматически, если вы используете zip в Python 3 и выше.

4 голосов
/ 18 декабря 2011

Вы можете использовать itertools.izip , например,

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

. Это обеспечит, что результирующим будет также генератор.

Если вы предпочитаете использовать второе здеськак ты можешь это сделать

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))
3 голосов
/ 18 декабря 2011

Вы можете получить пары вещей (ваш первый запрос), используя zip(g1, g2).Вы можете присоединиться к ним (ваш второй запрос), выполнив [a + b for a, b in zip(g1, g2)].

Почти эквивалентно, вы можете использовать map.Используйте map(None, g1, g2) для создания списка пар и map(lambda x, y: x + y, g1, g2) для объединения пар.

В ваших примерах ваши генераторы создают список или кортеж каждый раз, из которых вас интересует толькопервый элемент.Я просто сгенерировал бы то, что вам нужно, или предварительно обработал бы их, прежде чем архивировать или отображать их.Например:

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

В качестве альтернативы, вы можете применить [0] на карте.Вот два случая:

map(lambda x, y: (x[0], y[0]), g1, g2)
map(lambda x, y: x[0] + y[0], g1, g2)
2 голосов
/ 18 декабря 2011

Допустим, у вас есть g1 и 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']],
]

Чтобы получить это:

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

Вы можете сделать это:

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

А для второго:

[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]]
...