Ответ 1
Не нужно распаковывать и переупаковывать кортежи, возвращенные zip:
'\n'.join(' '.join(x) for x in zip(a, b))
В частности, у меня есть два списка строк, которые я хотел бы объединить в строку, где каждая строка представляет собой следующие две строки из списков, разделенные пробелами:
a = ['foo1', 'foo2', 'foo3']
b = ['bar1', 'bar2', 'bar3']
Мне нужна функция comb_to_lines(), которая вернет:
"""foo1 bar1
foo2 bar2
foo3 bar3"""
Я признаю, что я уже решил эту проблему, поэтому я отправлю ответ. Но, возможно, у кого-то есть лучший, или у меня есть недостаток.
Обновление: я слишком упростил мой пример выше. В моей реальной проблеме линии были отформатированы более сложным образом, что требовало, чтобы кортежи, возвращаемые из zip(), были распакованы. Но пригодился mhawke для перехода к самому простому решению этого примера.
Не нужно распаковывать и переупаковывать кортежи, возвращенные zip:
'\n'.join(' '.join(x) for x in zip(a, b))
zip function "возвращает список кортежей, где i-й кортеж содержит i-й элемент из каждой последовательности аргументов или iterables."
def combine_to_lines(list1, list2):
return '\n'.join([' '.join((a, b)) for a, b in zip(list1, list2)])
>>> a = ['foo1', 'foo2', 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> for i in zip(a,b):
... print ' '.join(i)
...
foo1 bar1
foo2 bar2
foo3 bar3
Вы спрашиваете о zip функции?
Я понимаю, что это очень старый вопрос, но интересно отметить, что это можно рассматривать как транспонирование матриц.
>>> 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']]
Если вы имеете дело с большим набором данных или более списками, это может быть более эффективное решение.
Здесь один лайнер. Могли бы сделать 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
'\n'.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b)))
Прост как:
" ".join([a[x] + " " + b[x] for x in range(len(a))])
В 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))