Как вы генерируете упорядоченную линейную комбинацию значений в словаре? - PullRequest
2 голосов
/ 13 июня 2019

У меня словарь настроен так:

d1 = {1:['A'],2:['B'],3:['C','D'],4:['E','F'],5:['G'],6:['A']}

Мне нужно объединить все линейные комбинации значений из этого словаря. Тем не менее, порядок букв в каждом списке важен: сцепленные строки должны генерироваться только для тех, которые находятся в одном и том же порядке, т. Е. Должны объединяться «C» и «E», а не «D» и «E». Например, результаты с использованием словаря выше должны выглядеть следующим образом:

String 1 = 'ABCEGA'

String 2 = 'ABDFGA'

1 Ответ

1 голос
/ 14 июня 2019

Вот один из подходов, использующий itertools.zip_longest:

from itertools import zip_longest

z = list(map(list,(zip_longest(*d1.values()))))
# [['A', 'B', 'C', 'E', 'G', 'A'], [None, None, 'D', 'F', None, None]]

for ix_i, i in enumerate(z):
    for ix_j, j in enumerate(i):
        if not j:
            z[ix_i][ix_j] = z[ix_i-1][ix_j]

list(map(''.join, z))
# ['ABCEGA', 'ABDFGA']

Довольно непонятный itertools подход на основе:

from itertools import zip_longest, accumulate

z = zip_longest(*d1.values())
out = [[*accumulate(i, lambda x, y: y or x)] for i in zip(*z)]
list(map(''.join, zip(*out)))
# ['ABCEGA', 'ABDFGA']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...