Соединение пар элементов списка-Python
Я знаю, что список можно соединить в одну длинную строку, как в:
x = ['a', 'b', 'c', 'd']
print ''.join(x)
очевидно, что это будет выход:
'abcd'
однако то, что я пытаюсь сделать, это просто присоединиться к первой и второй строкам в списке, а затем присоединиться к третьей и четвертой и так далее. Короче говоря, из приведенного выше примера вместо достижения результата:
['ab', 'cd']
есть ли простой способ сделать это? Я должен также упомянуть, что длины строк в списке будут непредсказуемо, как и количество строк в списке, хотя количество строк всегда будет четным. Таким образом, исходный список также может быть:
['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']
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']