Учитывая два списка уникальных меток, таких как:
a = ['Joe', 'Mary', 'Sue']
b = ['S0', 'S1', 'S2', 'S3', 'S4', 'S5']
Как мне эффективно найти все возможные комбинации, в которых элементы из списка a
заменяются или отображаются в список b
? например Если S0 = S1 = Джо, S2 = Мэри, S3 = S4 = S5 = Сью, то я бы имел:
{'S0': 'Joe', 'S1': 'Joe', 'S2': 'Mary', 'S3': 'Sue', 'S4': 'Sue', 'S5': 'Sue'}
Я начал с этого простого подхода с вложенным циклом for:
def iter_mapping_combos(names1, names2):
q = [(names2, {})]
priors = set()
while q:
_names2, _mapping = q.pop(0)
key = (frozenset(_names2), frozenset(_mapping.items()))
if key in priors:
continue
priors.add(key)
for n1 in names1:
for n2 in _names2:
if n2 in _mapping:
continue
_mapping_next = dict(_mapping)
_mapping_next[n2] = n1
_names2_next = set(_names2)
_names2_next.remove(n2)
if _names2_next:
q.append((_names2_next, _mapping_next))
else:
yield _mapping_next
for mapping in iter_mapping_combos(['Joe', 'Mary', 'Sue'], ['S0', 'S1', 'S2', 'S3', 'S4', 'S5']):
print(mapping)
Это работает, но, как вы можете себе представить, это не так эффективно и плохо масштабируется по мере увеличения длины списков. Есть лучший способ сделать это?