Получить объединенную строку из списка списков строк в Python

У меня есть список списков и строка разделителя вроде этого:

lists = [
    ['a', 'b'],
    [1, 2],
    ['i', 'ii'],
]
separator = '-'

В результате я хочу иметь список строк в сочетании с строкой разделителя из строк в подписок:

result = [
    'a-1-i', 
    'a-1-ii', 
    'a-2-i', 
    'a-2-ii',
    'b-1-i', 
    'b-1-ii', 
    'b-2-i', 
    'b-2-ii',
]

Заказ в результате не имеет значения.

Как я могу это сделать?

Ответ 1

from itertools import product
result = [separator.join(map(str,x)) for x in product(*lists)]

itertools.product возвращает итератор, который производит декартово произведение предоставленных итераций. Нам нужно map str по результирующим наборам, так как некоторые из значений являются ints. Наконец, мы можем присоединиться к строковым кортежам и бросить все это в понимании списка (или выражение генератора, если вы имеете дело с большим набором данных, и вам просто нужно его для итерации).

Ответ 2

>>> from itertools import product
>>> result = list(product(*lists))
>>> result = [separator.join(map(str, r)) for r in result]
>>> result
['a-1-i', 'a-1-ii', 'a-2-i', 'a-2-ii', 'b-1-i', 'b-1-ii', 'b-2-i', 'b-2-ii']

Как указано в @jpm, вам не нужно бросать list в генератор product. У меня было это, чтобы увидеть результаты в моей консоли, но они здесь действительно не нужны.

Ответ 3

Вы можете сделать это со встроенными функциями:

>>> map(separator.join, reduce(lambda c,n: [a+[str(b)] for b in n for a in c], lists, [[]]))
['a-1-i', 'b-1-i', 'a-2-i', 'b-2-i', 'a-1-ii', 'b-1-ii', 'a-2-ii', 'b-2-ii']

Ответ 4

["%s%c%s%c%s" % (a, separator, b, separator, c) for a in lists[0] for b in lists[1] for c in lists[2]]