Элемент целесообразно объединить несколько списков (список списка строк) - PullRequest
6 голосов
/ 06 июня 2019

У меня есть список строк, как показано ниже

lst = [['a','b','c'],['@','$','#'],['1','2','3']]

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

['a@1','b$2','c#3']

Размер lst может варьироваться. Есть ли способ сделать это без прохождения циклов.
Я пытался использовать карту, но она не работает.

map(str.__add__,(x for x in list))

пожалуйста, помогите.

Ответы [ 3 ]

11 голосов
/ 06 июня 2019

Вот один из способов архивирования подсписков и сопоставления с ''.join полученными кортежами:

list(map(''.join, zip(*lst)))
# ['a@1', 'b$2', 'c#3']

Здесь zip, как показано в документах, агрегирует элементы из несколькихитерируемые.Добавляя *, мы распаковываем список, что означает, что функция вместо этого будет получать zip(['a','b','c'],['@','$','#'],['1','2','3']).

Теперь на каждой итерации map будет применять ''.join к каждому из агрегированных итераций, то есть к первому элементу в каждом подсписке, затем ко второму и т. Д.

2 голосов
/ 06 июня 2019

Не так элегантно, как ответ yatu , но если вы используете панд:

import pandas as pd
pd.DataFrame(lst).sum(axis=0)

# 0    a@1
# 1    b$2
# 2    c#3
# dtype: object

Ряд Панд имеет метод .tolist() для получения ожидаемого результата:

series = pd.DataFrame(lst).sum(axis=0)
series.tolist()

# ['a@1', 'b$2', 'c#3']
1 голос
/ 07 июня 2019

У меня были следующие проблемы со строками в списке,
1) дополнительные пробелы , включая ведущие и конечные,
2), также пришлось объединить строки с пробелом между .
3) Длина списка внутри списка не совпадает всегда, для приведенных нижепример длины list[0], list[1] и list[2] равен 4,4 and 3.

пример списка, как показано ниже:

lst= [['  It is    raining  ','  Hello Mr.   x','  Life   is what   happens','This'],
      ['cats   and   dogs','how are you','when you are busy','ends here'],
      ['here now    ','doing today?    ','making   other   plans  ']]

Первый и второй случаи могут быть решены путем разделения каждого элемента в списке (разделение по умолчанию с использованием пробела, который удалит все пробелы), а затемсоединяя их вместе с одним пробелом между ними.
Объединить элементы различной длины можно с помощью itertools.zip_longest, с fillvalue='', как показано ниже:

from itertools import zip_longest
[' '.join(x.split()) for x in map(' '.join, zip_longest(*lst,fillvalue=''))]

, как показано ниже:

['It is raining cats and dogs here now',
 'Hello Mr. x how are you doing today?',
 'Life is what happens when you are busy making other plans',
 'This ends here']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...