Я хочу создать функцию в Python, которая в качестве входных данных принимает список с неопределенным количеством строк, длина которых также не является стандартной или одинаковой друг с другом. Ввод будет выглядеть так:

list = ['1234', '4', '97', ... , '542']

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

input = ['12', '45', '865']
output = ['148', '146', '145', '158', '156', '155',
 '248', '246', '245', '258', '256', '255']

Есть ли алгоритм для этого? Я не совсем новичок в Python, но эта проблема ставит меня в тупик. Спасибо за любую помощь.

0
Shivalnu 24 Апр 2017 в 21:52

2 ответа

Лучший ответ
from itertools import product

input = ['12', '45', '865']

[''.join(prod) for prod in product(*input)]

# ['148', '146', '145', '158', '156', '155', '248', '246',
#  '245', '258', '256', '255']

itertools.product принимает несколько итераций в качестве параметров, и дает их декартово произведение.
Поскольку ваши итерируемые элементы (ваши строки) находятся в списке, мы используем синтаксис * input, чтобы распаковать элементы списка для разделения позиционных параметров.

4
Thierry Lathuille 24 Апр 2017 в 19:03

Протестировано с Python 2.7

Input = ['12', '45', '865']
out = [[]]

# algo
for liste in Input:
    out = [x + [y] for x in out for y in liste]
    #print out # un comment to see how algo works

index = 0
while index < len(out):
    out[index] = ''.join(out[index])
    index += 1

print out

# prodcues:
# ['148', '146', '145', '158', '156', '155',
#  '248', '246', '245', '258', '256', '255']
# The while loop can be reduced to:
# print [''.join(liste) for liste in out]
1
KingMak 27 Апр 2017 в 17:51