Как преобразовать отдельный элемент списка в несколько элементов списка? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть список, и я хочу разделить каждый элемент списка на несколько элементов, если появится запятая. Если появляется запятая (в пределах l2, используя этот пример), я хочу продублировать тот же элемент в пределах l1 to, чтобы соответствовать количеству запятых, найденных в l2. Это может показаться запутанным, но ниже это может быть объяснено немного лучше

l1 = ['1', '2', '3', '4', '5']
l2 = ['Sam', 'John', 'Steve, Harry, Lucy', 'Mike, Sam', 'Becky']

Предполагаемый результат:

l1 = ['1', '2', '3', '3', '3', '4', '4', '5']
l2 = ['Sam', 'John', 'Steve', 'Harry', 'Lucy', 'Mike', 'Sam', 'Becky']

Я пробовал x.split(',') в списке, но это создало несколько вложенных списков (показано ниже):

l2 = [['Sam'], ['John'], ['Steve', 'Harry', 'Lucy']] ..........

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Это ваш ввод:

names = ['Sam', 'John', 'Steve, Harry, Lucy', 'Mike, Sam', 'Becky']

Это мое предлагаемое решение:

l1, l2 = map(list, zip(*[(ix, i) for ix, split in 
            enumerate(map(lambda x: x.split(), names), 1) for i in split]))

Результат:

[1, 2, 3, 3, 3, 4, 4, 5]
['Sam', 'John', 'Steve,', 'Harry,', 'Lucy', 'Mike,', 'Sam', 'Becky']

Вы не t даже требуется l1 в качестве входных данных, если вы используете только увеличивающиеся числа.

1 голос
/ 17 июня 2020

У вас есть еще несколько ответов, которые кажутся мне хорошими, но не очень интуитивно понятными. Вот альтернативный подход, который не требует так много умственной энергии:

orig_nums = ['1', '2', '3', '4', '5']
orig_names = ['Sam', 'John', 'Steve, Harry, Lucy', 'Mike, Sam', 'Becky']

tups = [
    (n, nm)
    for n, names in zip(orig_nums, orig_names)
    for nm in names.split(', ')
]

for t in tups:
    print(t)

Вывод:

('1', 'Sam')
('2', 'John')
('3', 'Steve')
('3', 'Harry')
('3', 'Lucy')
('4', 'Mike')
('4', 'Sam')
('5', 'Becky')

Вы можете легко разделить tups на 2 отдельных списка, если вам действительно нужно , но каждый раз, когда я вижу, что кто-то работает с параллельными списками, мой первый вопрос: «Почему бы не объединить данные?» Иногда на то есть веские причины, но вы должны убедиться, что она у вас действительно есть.

0 голосов
/ 17 июня 2020

Вы можете использовать понимание списка, используя zip для параллельного перебора двух списков:

from itertools import chain

l1 = ['1', '2', '3', '4', '5']
l2 = ['Sam', 'John', 'Steve, Harry, Lucy', 'Mike, Sam', 'Becky']

l1 = list(chain.from_iterable([[x] * len(y.split(',')) for x, y in zip(l1, l2)]))
l2 = list(chain.from_iterable([x.split(',') for x in l2]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...