последовательно объединять строки в Python - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно последовательно объединить строки в списке, чтобы объединить две части слов, разделенных переносами строк.Кто-нибудь может мне помочь?

list = ["a", "b", "c", "d"]

Требуемый вывод:

"ab"
"cd"   

Ответы [ 8 ]

0 голосов
/ 28 февраля 2019

Вы можете нарезать свой список на четные и нечетные элементы.

Допустим, ваш список называется l

Четные элементы - l[::2]

Нечетныеelements - l[1::2]

Тогда вы можете использовать понимание списка, чтобы объединить их после архивирования.Итак:

[x + y for x, y in zip(l[::2], l[1::2])]

0 голосов
/ 28 февраля 2019

Вы можете определить метод, который группирует для вас элементы в списке:

def group_by(iterable, n = 2):
  if len(iterable)%n != 0: raise Exception("Error: uneven grouping")
  # if n < 2: n = 1
  i, size = 0, len(iterable)
  while i < size-n+1:
    yield iterable[i:i+n]
    i += n

Так, например, если ваш список:

words = ["a", "b", "c", "d"]
group_by(words, 2) #=> [['a', 'b'], ['c', 'd']]

Или вы можете сгруппировать по 3:

words = ["a", "b", "c", "d", "e", "f"]
cons = group_by(words, 3) #=> [['a', 'b', 'c'], ['d', 'e', 'f']]

Тогда вы можете использовать таким образом:

res = [ "".join(pair) for pair in group_by(words, 2) ] # maybe you want to add "\n" to the joined string
#=> ['ab', 'cd', 'ef']


Метод выдает ошибку, если количество элементов не может быть равномерно сгруппировано:
words = ["a", "b", "c", "d", "e"]
cons = group_by(words, 2) #=> Exception: Error: uneven grouping
0 голосов
/ 28 февраля 2019

Вы также можете starmap архивировать списки для оператора concat:

from operator import concat
from itertools import starmap

l = ["a", "b", "c", "d"]

z = zip(l[::2], l[1::2])

list(starmap(concat, z))
# ['ab', 'cd']
0 голосов
/ 28 февраля 2019

Извините, что я использую большую часть времени NumPy.Таким образом, решение может быть:

li = ['a', 'b', 'c', 'd']
L = np.array(li)

a1 = np.char.array([L[0], L[2]])
a2 = np.char.array([L[1], L[3]])

a1 + a2

chararray(['ab', 'cd'], dtype='<U2')
0 голосов
/ 28 февраля 2019

Используя общий итератор,

>>> [x + next(itr) for itr in [iter(lst)] for x in itr]
['ab', 'cd']

В готовящемся выпуске Python 3.8 (ETA осень 2019) это можно записать более кратко (я считаю) как

[x + next(itr) for x in (itr:=iter(lst))]
0 голосов
/ 28 февраля 2019
for i in range(0, len(l), 2):
    ''.join(l[i:i + 2])
0 голосов
/ 28 февраля 2019

Учитывая список,

L=['a', 'b', 'c', 'd']

(обратите внимание, не перехватывая ключевое слово list для имени переменной)

вы можете пройти через это в два этапа:

for i in range(0,len(L)-1,2):
  print(L[i]+L[i+1])

Используйте rstrip для удаления символов справа, например L[i].rstrip('\n')

0 голосов
/ 28 февраля 2019

Предполагая, что вы хотите объединить пары последовательных элементов:

>>> lst = ['a', 'b', 'c', 'd']
>>> list(map(''.join, zip(*([iter(lst)]*2))))
['ab', 'cd']

Здесь zip(*([iter(lst)]*2)) - это обычный рецепт для пар элементов путем zip двух экземпляров одного итератора в списке,но есть много других способов сделать то же самое.

(Примечание: переименовано list в lst, чтобы не скрывать встроенный тип)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...