Как я могу перебирать кортежи элементов двух или более списков в Python?

В частности, у меня есть два списка строк, которые я хотел бы объединить в строку, где каждая строка представляет собой следующие две строки из списков, разделенные пробелами:

a = ['foo1', 'foo2', 'foo3']
b = ['bar1', 'bar2', 'bar3']

Мне нужна функция comb_to_lines(), которая вернет:

"""foo1 bar1
foo2 bar2
foo3 bar3"""

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

Обновление: я слишком упростил мой пример выше. В моей реальной проблеме линии были отформатированы более сложным образом, что требовало, чтобы кортежи, возвращаемые из zip(), были распакованы. Но пригодился mhawke для перехода к самому простому решению этого примера.

Ответ 1

Не нужно распаковывать и переупаковывать кортежи, возвращенные zip:

'\n'.join(' '.join(x) for x in zip(a, b))

Ответ 2

zip function "возвращает список кортежей, где i-й кортеж содержит i-й элемент из каждой последовательности аргументов или iterables."

def combine_to_lines(list1, list2):
    return '\n'.join([' '.join((a, b)) for a, b in zip(list1, list2)])

Ответ 3

>>> a = ['foo1', 'foo2', 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> for i in zip(a,b):
...   print ' '.join(i)
...
foo1 bar1
foo2 bar2
foo3 bar3

Ответ 4

Вы спрашиваете о zip функции?

Ответ 5

Я понимаю, что это очень старый вопрос, но интересно отметить, что это можно рассматривать как транспонирование матриц.

>>> import numpy
>>> data = numpy.array([['foo1','foo2','foo3'],['bar1','bar2','bar3']])
>>> print(data)
[['foo1' 'foo2' 'foo3']
 ['bar1' 'bar2' 'bar3']]
>>> print(data.transpose())
[['foo1' 'bar1']
 ['foo2' 'bar2']
 ['foo3' 'bar3']]

Если вы имеете дело с большим набором данных или более списками, это может быть более эффективное решение.

Ответ 6

Здесь один лайнер. Могли бы сделать x + ' ' + y, если бы вы были настолько склонны, не уверены, будет ли это медленнее или нет.

>>> a = ['foo1', 'foo2' , 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> '\n'.join(' '.join([x,y]) for (x,y) in zip(a,b))
'foo1 bar1\nfoo2 bar2\nfoo3 bar3'
>>> print _
foo1 bar1
foo2 bar2
foo3 bar3

Ответ 7

'\n'.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b)))

Ответ 8

Прост как:

" ".join([a[x] + " " + b[x] for x in range(len(a))])

Ответ 9

В python 3.x:

'\n'.join(' '.join(x) for x in zip(a, b))

zip возвращает список кортежей. zip останавливается, когда заканчивается более короткое число a или b.

В python 2.x:

если itertools.izip остановится, когда в одном из списков закончились элементы, но itertools.izip_longest остановится, пока в списках не будет больше элементов

import itertools
'\n'.join(' '.join(x) for x in itertools.izip(a, b))

'\n'.join(' '.join(x) for x in itertools.izip_longest(a, b))