Получить объединенную строку из списка списков строк в 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]]