2015-04-24 3 views

ответ

9

Вы хотите itertools.zip_longest с fillvalue пустой строки:

a = ['1', '2'] 
b = ['11', '22', '33', '44'] 

from itertools import zip_longest # izip_longest for python2 

print(list(zip_longest(a,b, fillvalue=""))) 
[('1', '11'), ('2', '22'), ('', '33'), ('', '44')] 

Для python2 это izip_longest:

from itertools import izip_longest 

print(list(izip_longest(a,b, fillvalue=""))) 
[('1', '11'), ('2', '22'), ('', '33'), ('', '44')] 

Если вы просто хотите использовать значения, которые вы можете итерацию по объект izip:

for i,j in izip_longest(a,b, fillvalue=""): 
    # do whatever 

Некоторых тайминги против использования карты:

In [51]: a = a * 10000 

In [52]: b = b * 9000 

In [53]: timeit list(izip_longest(a,b,fillvalue="")) 
100 loops, best of 3: 1.91 ms per loop 

In [54]: timeit [('', i[1]) if i[0] == None else i for i in map(None, a, b)] 
100 loops, best of 3: 6.98 ms per loop 

map также создает еще один список, используя python2 так и для больших списков или если у вас есть ограничения памяти его лучше избегать.

+1

это говорит не может импортировать имя zip_longest – sam

+0

'izip_longest для python2' –

+1

Я использую python 2.7 – sam

-1

В Python 2.7: еще один способ сделать это:

[('', i[1]) if i[0] == None else i for i in map(None, a, b)] 

Для примера списков, приведенных в вопросе, этот путь быстрее, чем при использовании с помощью izip_longest:

>>> timeit.timeit("[('', i[1]) if i[0] == None else i for i in map(None, a, b)]", 'from __main__ import a, b') 
1.3226220607757568 

>>> timeit.timeit("list(itertools.izip_longest(a, b, fillvalue=''))", 'from __main__ import a, b') 
1.629504919052124 

Если списки дольше и несуществующее значение должно быть заполнено '', тогда izip_longest значительно быстрее.

Однако, если вы хотите создать результирующий список, созданный с помощью None, а не '', вам не потребуется понимание списка или условное: map(None, a, b). Тогда скорость может быть аналогична скорости для izip_ilongest для более длинных списков.

Обратите внимание, что при объединении списков неравной длины не обязательно, чтобы результат должен занимать длину более длинного. Если вы хотите, чтобы функция типа zip всегда занимала длину первого аргумента, тогда загораются ответы на вопрос SO «Is there a middle ground between `zip` and `zip_longest`».

Смежные вопросы