Объединить подсписок с каждым элементом списка

У меня есть список списков, и мне нужно объединить их вместе с каждым элементом списка. См. пример ниже:

my_list = [1, [2, 3], [4, 5]]

Ожидаемый результат:

['1', '1.2', '1.3', '1.2.4', '1.2.5', '1.3.4', '1.3.5']

Я пытался написать логику, но всегда не хватает того или иного элемента.

Покажите свой код как правильно отформатированный текст в вопросе.

Michael Butscher 07.01.2023 20:57

Вы пытаетесь создать список строк в результате? Потому что то, что вы показали как ожидаемый результат, не является допустимым синтаксисом Python.

mkrieger1 07.01.2023 21:02

Да, вывод должен быть строкой для каждого элемента

varun22486 07.01.2023 21:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
81
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

def join_lists(result, prefix, items):
    if not items:
        result.append('.'.join(map(str, prefix)))
    else:
        for i, item in enumerate(items[0]):
            join_lists(result, prefix + [item], items[1:])
        join_lists(result, prefix, items[1:])

my_list = [1, [2, 3], [4, 5]]
result = []
join_lists(result, [1], my_list)
print(result)

будет производить:

Output: ['1', '1.2', '1.3', '1.2.4', '1.2.5', '1.3.4', '1.3.5']

Спасибо. Одна проблема: вы добавили 1 в качестве префикса, однако это не всегда так, даже если первый элемент может быть подсписком. в основном логика должна искать все элементы в списке и объединять их. даже второй или другие элементы в списке гарантированно являются подсписком, это может быть элемент или список.

varun22486 07.01.2023 21:33

Вы можете сделать это:

import itertools
my_list = [1, [2, 3], [4, 5]]

# First convert each scalar into list 
my_list = [[e] if not isinstance(e, list) else e for e in my_list]

# and then each element into str
my_list = [list(map(str, e)) for e in my_list]

# Then initialize a result list and keep extending with product of the result 
# with the next element in my_list
t = my_list[0]
out = []
out.extend(t)
for lst in my_list[1:]:
    t = list(map('.'.join, itertools.product(t, lst)))
    out.extend(t)
print(out)

['1', '1.2', '1.3', '1.2.4', '1.2.5', '1.3.4', '1.3.5']

# for the input my_list = [[1,2],3,[4,5]]
my_list = [[1,2],3,[4,5]]
print(out)
['1', '2', '1.3', '2.3', '1.3.4', '1.3.5', '2.3.4', '2.3.5']

Это не будет работать, если 1-й элемент сам по себе является примером подсписка: my_list=[[1,2],3,[4,5]]

varun22486 07.01.2023 22:13

Каков ожидаемый результат для этого входа?

SomeDude 07.01.2023 22:23

в основном все комбинации всех предметов. ожидаемый результат будет ['1.3.4', '1.3.5', '1.3', '1', '2.3.4', '2.3.5', '2.3', '2']

varun22486 07.01.2023 22:36

Прежде всего, вывод, который я получаю для ввода, указанного вами в комментарии, такой же, как вы ожидаете, за исключением порядка. См. обновленный ответ для вывода для второго ввода. Во-вторых, вам нужно четко указать это в постановке задачи, а также честно рассказать о своей попытке.

SomeDude 07.01.2023 23:48
Ответ принят как подходящий

Используя itertools.accumulate:

from itertools import accumulate, product

# ensure sub-items are lists
def as_lst(x):
    return x if isinstance(x, list) else [str(x)]

out = [str(e) for l in (accumulate(map(as_lst, my_list),
                                   lambda *x: ['.'.join(map(str, y))
                                               for y in product(*x)])
                       )
       for e in as_lst(l)]

print(out)

Выход:

['1', '1.2', '1.3', '1.2.4', '1.2.5', '1.3.4', '1.3.5']

Вывод для my_list=[[1,2],3,[4,5]]:

['1', '2', '1.3', '2.3', '1.3.4', '1.3.5', '2.3.4', '2.3.5']

Другие вопросы по теме