Python 将数字列表映射到具有多个值的字典键

Python 将数字列表映射到具有多个值的字典键,python,Python,我将从一个例子开始。假设我有一本字典,比如: d = {1:['A','B'], 2:['C']} 和一份清单: vals = [1,2] 我想将列表(VAL)中的这些值映射到字典(d)中所有可能的值。因此,这里的输出应该是两个列表,例如: [[ 'A','C']['B','C']] 这基本上就是我现在面临的问题。我想我可以用for循环来实现,但当我们面对这个字典和值列表时,我不能用for循环甚至嵌套循环来实现: d = {1:['A','B','C'] , 2:['D

我将从一个例子开始。假设我有一本字典,比如:

d = {1:['A','B'],
     2:['C']}
和一份清单:

vals = [1,2]
我想将列表(VAL)中的这些值映射到字典(d)中所有可能的值。因此,这里的输出应该是两个列表,例如:

[[ 'A','C']['B','C']]
这基本上就是我现在面临的问题。我想我可以用for循环来实现,但当我们面对这个字典和值列表时,我不能用for循环甚至嵌套循环来实现:

d = {1:['A','B','C'] ,
     2:['D','E'],
     3:['F','G'],
     4:['I'] }

values = [1,2,3,4]
此处的输出应为:

[['A', 'D', 'F', 'I'], 
 ['A', 'D', 'G', 'I'],
 ['A', 'E', 'F', 'I'], 
 ['A', 'E', 'G', 'I'],
 ['B', 'D', 'F', 'I'], 
 ['B', 'D', 'G', 'I'],
 ['B', 'E', 'F', 'I'],
 ['B', 'E', 'G', 'I'], 
 ['C', 'D', 'F', 'I'],
 ['C', 'D', 'G', 'I'],
 ['C', 'E', 'F', 'I'],
 ['C', 'E', 'G', 'I']]
您可以为此使用
product()
。只需理解要包含的索引,并将它们传递给
product()
。如果您对元组没意见,这是一个很好的一行:

import itertools

list(itertools.product(*(d[x] for x in values)))
结果:

[('A', 'D', 'F', 'I'),
 ('A', 'D', 'G', 'I'),
 ('A', 'E', 'F', 'I'),
 ('A', 'E', 'G', 'I'),
 ('B', 'D', 'F', 'I'),
 ('B', 'D', 'G', 'I'),
 ('B', 'E', 'F', 'I'),
 ('B', 'E', 'G', 'I'),
 ('C', 'D', 'F', 'I'),
 ('C', 'D', 'G', 'I'),
 ('C', 'E', 'F', 'I'),
 ('C', 'E', 'G', 'I')]
您可以为此使用
product()
。只需理解要包含的索引,并将它们传递给
product()
。如果您对元组没意见,这是一个很好的一行:

import itertools

list(itertools.product(*(d[x] for x in values)))
结果:

[('A', 'D', 'F', 'I'),
 ('A', 'D', 'G', 'I'),
 ('A', 'E', 'F', 'I'),
 ('A', 'E', 'G', 'I'),
 ('B', 'D', 'F', 'I'),
 ('B', 'D', 'G', 'I'),
 ('B', 'E', 'F', 'I'),
 ('B', 'E', 'G', 'I'),
 ('C', 'D', 'F', 'I'),
 ('C', 'D', 'G', 'I'),
 ('C', 'E', 'F', 'I'),
 ('C', 'E', 'G', 'I')]

如果您需要简单的工作解决方案,请使用Mark Meyer的解决方案,但是,如果您想知道通过
for
s是否可行,请按照以下方式回答是“是”:

d = {1:['A','B','C'] ,2:['D','E'],3:['F','G'],4:['I']}
for k in sorted(d.keys())[:-1][::-1]:
    d[k] = [(i+j) for i in d[k] for j in d[k+1]]
out = [tuple(i) for i in d[1]]
print(out)
给出:

[('A', 'D', 'F', 'I'), ('A', 'D', 'G', 'I'), ('A', 'E', 'F', 'I'), ('A', 'E', 'G', 'I'), ('B', 'D', 'F', 'I'), ('B', 'D', 'G', 'I'), ('B', 'E', 'F', 'I'), ('B', 'E', 'G', 'I'), ('C', 'D', 'F', 'I'), ('C', 'D', 'G', 'I'), ('C', 'E', 'F', 'I'), ('C', 'E', 'G', 'I')]
请注意,此解决方案假定dict
d
是正确的,即其键是从
1
开始的后续数字,所有值都是一个字母
str
s的
list
s。现在说明:的外部
正在处理从第二大到
1
的数字,降序,在这种特殊情况下:
3
2
1
。列表理解是将
k
-th列表与
(k+1)
-th列表的
SQL交叉连接(如
SQL交叉连接
)与
(k+1)
-th列表进行“每一次”连接,并且效果存储在当前键
k
下。
最后,我检索
str
s的
list
d[1]
,并将其转换为符合要求的
tuple
s的
list
。如果您不清楚此解决方案的工作原理,请复制代码片段,在
d[k]=
下面添加
print(d)
。。。然后观察它打印的内容。

如果您需要简单的工作解决方案,请使用Mark Meyer的解决方案,但是如果您想知道通过
for
s是否可行,请按照以下方式回答是肯定的:

d = {1:['A','B','C'] ,2:['D','E'],3:['F','G'],4:['I']}
for k in sorted(d.keys())[:-1][::-1]:
    d[k] = [(i+j) for i in d[k] for j in d[k+1]]
out = [tuple(i) for i in d[1]]
print(out)
给出:

[('A', 'D', 'F', 'I'), ('A', 'D', 'G', 'I'), ('A', 'E', 'F', 'I'), ('A', 'E', 'G', 'I'), ('B', 'D', 'F', 'I'), ('B', 'D', 'G', 'I'), ('B', 'E', 'F', 'I'), ('B', 'E', 'G', 'I'), ('C', 'D', 'F', 'I'), ('C', 'D', 'G', 'I'), ('C', 'E', 'F', 'I'), ('C', 'E', 'G', 'I')]
请注意,此解决方案假定dict
d
是正确的,即其键是从
1
开始的后续数字,所有值都是一个字母
str
s的
list
s。现在说明:
的外部
正在处理从第二大到
1
的数字,降序,在这种特殊情况下:
3
2
1
。列表理解是将
k
-th列表与
(k+1)
-th列表的
SQL交叉连接(如
SQL交叉连接
)与
(k+1)
-th列表进行“每一次”连接,并且效果存储在当前键
k
下。
最后,我检索
str
s的
list
d[1]
,并将其转换为符合要求的
tuple
s的
list
。如果您不清楚此解决方案的工作原理,请复制代码片段,在
d[k]=
下面添加
print(d)
。。。并观察它打印的内容。

那么,您要求的是指定索引的所有组合,对吗?@hawk_uu您可以发布您当前拥有的任何代码以及它输出的内容吗?我们希望看到您在这方面做出一些努力,并尽可能为您指明正确的方向,而不是编写您可能更难理解的新代码。因此,您要求的是指定索引的所有组合,对吗?@hawk_uu您可以发布您当前拥有的任何代码及其输出吗?我们希望看到您在这方面做出一些努力,并尽可能为您指明正确的方向,而不是编写您可能难以遵循的新代码。