PYTHON:如何使用存储每个可能的字母映射组合的字典创建每个可能的字母映射的列表?

PYTHON: How do I create a list of every possible letter mapping using a dictionary that stores every possible letter mapping combination?

我正在开发一个破解一对一映射密码的程序,其中当前状态存储在字典中,字典中包含每个字母的可能映射。每个字母键都包含它可能映射到的字母列表。最后,每个字母列表中应该只有一个字母。对于这个问题,字典看起来像这样,带有相应的 (key : value) 对:

'A' : ['A']
'B' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'C' : ['C']
'D' : ['D']
'E' : ['E']
'F' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'G' : ['G', 'W']
'H' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'I' : ['I']
'J' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'K' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'L' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'M' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'N' : ['N']
'O' : ['O']
'P' : ['P']
'Q' : ['Q']
'R' : ['R']
'S' : ['S']
'T' : ['T']
'U' : ['U']
'V' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'W' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
'X' : ['X']
'Y' : ['Y']
'Z' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']

我如何创建一个包含所有可能的映射情况作为元素的列表?这样的列表将包含每个可能的字典,其中每个字母键在其列表中只有一个字母值。这将用于找到当前状态的所有可能映射。一个示例元素是字典:

'A' : ['A']
'B' : ['B']
'C' : ['C']
'D' : ['D']
'E' : ['E']
'F' : ['F']
'G' : ['G']
'H' : ['H']
'I' : ['I']
'J' : ['J']
'K' : ['K']
'L' : ['L']
'M' : ['M']
'N' : ['N']
'O' : ['O']
'P' : ['P']
'Q' : ['Q']
'R' : ['R']
'S' : ['S']
'T' : ['T']
'U' : ['U']
'V' : ['V']
'W' : ['W']
'X' : ['X']
'Y' : ['Y']
'Z' : ['Z']

编辑: 我同意 MRule。总共会有 51,874,849,202 个单字母映射。考虑以下方法(在 python 2.7 中):

import itertools
from collections import OrderedDict
import string
seed = {
'A' : ['A'],
'B' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'C' : ['C'],
'D' : ['D'],
'E' : ['E'],
'F' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'G' : ['G', 'W'],
'H' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'I' : ['I'],
'J' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'K' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'L' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'M' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'N' : ['N'],
'O' : ['O'],
'P' : ['P'],
'Q' : ['Q'],
'R' : ['R'],
'S' : ['S'],
'T' : ['T'],
'U' : ['U'],
'V' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'W' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'],
'X' : ['X'],
'Y' : ['Y'],
'Z' : ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z'] 
}
d = OrderedDict(sorted(seed.items(), key=lambda t: t[0]))
listOfList = d.values()
for i in itertools.product(* listOfList):
    # print the possible dict
    print dict(zip(string.ascii_uppercase, i))

更新: To only calculate the possible dictionaries where every mapped letter is unique,你可以这样做:

import itertools
import string
others = ['B', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'V', 'W', 'Z']
# this dict is fixed
dict1 = {k : [k] for k in string.uppercase if k not in others}
# iterate all possibles in others, then merge two dicts into one
for i in itertools.permutations(others):
    dict2 = dict(zip(others, i))
    print dict(dict1.items() + dict2.items())