Соединение пар элементов списка-Python


Я знаю, что список можно соединить в одну длинную строку, как в:

x = ['a', 'b', 'c', 'd']
print ''.join(x)

очевидно, что это будет выход:

'abcd'

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

['ab', 'cd']

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

['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 
6 73

6 ответов:

вы можете использовать срез нотации с шагами:

>>> x = "abcdefghijklm"
>>> x[0::2] #0. 2. 4...
'acegikm'
>>> x[1::2] #1. 3. 5 ..
'bdfhjl'
>>> [i+j for i,j in zip(x[::2], x[1::2])] # zip makes (0,1),(2,3) ...
['ab', 'cd', 'ef', 'gh', 'ij', 'kl']

та же логика применяется и для списков. Длина строки не имеет значения, потому что вы просто добавляете две строки вместе.

использовать итератор.

список осмысления:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> [c+next(si, '') for c in si]
['abcde', 'fghijklmn', 'opqr']
  • очень эффективно для использования памяти.
  • ровно один обход s

генератор выражение:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> pair_iter = (c+next(si, '') for c in si)
>>> pair_iter # can be used in a for loop
<generator object at 0x4ccaa8>
>>> list(pair_iter) 
['abcde', 'fghijklmn', 'opqr']
  • использовать в качестве iterator

используя карту, str.__добавить__, ИТЭР

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> map(str.__add__, si, si)
['abcde', 'fghijklmn', 'opqr']

далее(итератор[, по умолчанию]) доступно начиная с Python 2.6

просто для обновления :-)

>>> x = ['a1sd','23df','aaa','ccc','rrrr', 'ssss', 'e', '']
>>> [x[i] + x[i+1] for i in range(0,len(x),2)]
['a1sd23df', 'aaaccc', 'rrrrssss', 'e']

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

[x[i] + x[i+1] if not len(x) %2 else 'odd index' for i in range(0,len(x),2)]

удачи

без построения временных списков:

>>> import itertools
>>> s = 'abcdefgh'
>>> si = iter(s)
>>> [''.join(each) for each in itertools.izip(si, si)]
['ab', 'cd', 'ef', 'gh']

или:

>>> import itertools
>>> s = 'abcdefgh'
>>> si = iter(s)
>>> map(''.join, itertools.izip(si, si))
['ab', 'cd', 'ef', 'gh']
>>> lst =  ['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 
>>> print [lst[2*i]+lst[2*i+1] for i in range(len(lst)/2)]
['abcde', 'fghijklmn', 'opqr']

Ну, я бы сделал это так, как я не люблю правила..

код

t = '1. eat, food\n\
7am\n\
2. brush, teeth\n\
8am\n\
3. crack, eggs\n\
1pm'.splitlines()

print [i+j for i,j in zip(t[::2],t[1::2])]

выход:

['1. eat, food   7am', '2. brush, teeth   8am', '3. crack, eggs   1pm']  

надеюсь, что это помогает :)