Я знаю, что список можно объединить в одну длинную строку, например:
x = ['a', 'b', 'c', 'd']
print ''.join(x)
Очевидно, это выведет:
'abcd'
Однако я пытаюсь просто соединить первую и вторую строки в списке, затем присоединить третью и четвертую и так далее. Короче говоря, вместо этого из приведенного выше примера получить результат:
['ab', 'cd']
Есть какой-нибудь простой способ сделать это? Я, вероятно, также должен упомянуть, что длина строк в списке будет непредсказуемой, как и количество строк в списке, хотя количество строк всегда будет четным. Таким образом, исходный список может быть таким:
['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']
Ответы:
Вы можете использовать обозначение среза с шагами:
>>> 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']
Та же логика применима и к спискам. Длина строки не имеет значения, потому что вы просто складываете две строки вместе.
источник
x[:::2]
создается объект,x[1::2]
создается еще один объект, эти создания, вероятно, основаны на вычислении индексов под капотом, и вызов функции с этими двумя объектами, переданными в качестве аргументов, необходим, прежде чем можно будет получить следующие пары элементов это должно быть объединено. В ответе kevpie просто создается один итератор, а затем итерация переходит от элемента к элементу нетронутого списка без необходимости заботиться об индексах, и это гораздо более питонично.itertools.islice
вместо [], удаляет промежуточные объекты. Но поскольку оба ответа работают при одинаковых условиях и возвращают одинаковые значения, они оба верны. Иzip(i[::2], i[1::2])
мне так мило, почему бы и нет? :)Используйте итератор.
Понимание списка:
>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) >>> [c+next(si, '') for c in si] ['abcde', 'fghijklmn', 'opqr']
Выражение генератора:
>>> 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']
Используя карту, str .__ add__, iter
>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) >>> map(str.__add__, si, si) ['abcde', 'fghijklmn', 'opqr']
next (iterator [, default]) доступен начиная с 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']
Надеюсь это поможет :)
источник