Создать список со всеми комбинациями словарей, где ключ появляется только один раз - PullRequest
0 голосов
/ 11 ноября 2019

Я пробовал разные подходы с помощью itertools, но просто не могу понять.

Мне нужно найти различные комбинации словарей:

letters = ['a','b','c']

combinations = []
for i in range(3):
    for t in letters:
        one_combi = {str(t):i}
        combinations.append(one_combi)

Теперь есть список словарей {буква: число} Теперь мне нужно создать список комбинаций, в которых ключ (буква) появляется только один раз.

Ожидаемый результат выглядит примерно так:

[{'a':0,'b':0,'c':0},
{'a':1,'b':0,'c':0},
{'a':1,'b':1,'c':0},
{'a':1,'b':1,'c':1},
{'a':2,'b':0,'c':0},
...
{'a':2,'b':2,'c':2}]

Было бы здорово, если бы кто-томожет помочь мне в этом!

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете сгенерировать все комбинации целых чисел из диапазона, полученного из длины ввода, а затем использовать zip:

letters = ['a','b','c']
def combos(d, c = []):
  if len(c) == len(d):
     yield dict(zip(letters, c))
  else:
     for i in d:
        yield from combos(d, c+[i])

print(list(combos(range(len(letters))))

Выход:

[{'a': 0, 'b': 0, 'c': 0}, 
{'a': 0, 'b': 0, 'c': 1}, 
{'a': 0, 'b': 0, 'c': 2}, 
{'a': 0, 'b': 1, 'c': 0}, 
{'a': 0, 'b': 1, 'c': 1}, 
...
{'a': 2, 'b': 2, 'c': 2}]
...