使用带循环的元组键创建字典

时间:2017-07-08 19:52:59

标签: python dictionary

我试图创建一个以元组为键的字典。

例如,如果我的范围是(0,3),我想创建一个包含每个组合映射的字典。例如。 {(0,0):1, (0,1):2, (0,2):1 ...},其中值为元组中的int。

如果范围是(0,4),则字典看起来像这样:

{(0,1,2):3, (0,0,0):1, (0,0,1):2...}

唯一的规则是密钥必须是一个未包含在元组中并且在给定范围内的值。

希望这是有道理的。我一直试图弄清楚如何在python中编写代码来做到这一点,但我不知道如何解决这个问题。

编辑完整示例: 范围:(0,3)

Dict Created:

{(0,0):1, (0,1):2, (0,2):1, (1,0):2, (1,1):2, (1,2): 0, (2,0): 1, (2,1):0, (2:2):1} 

是的,对于某些组合,例如(1,1)有多个可能的值。它可以是(1,1): 0(1,1): 2。我只需要一个。

1 个答案:

答案 0 :(得分:3)

使用itertools.product,您可以创建所有密钥。然后,您只需要找到一个在您的范围内但不在密钥中的值,可以使用set.difference来解决:

>>> import itertools

>>> the_range = range(0, 3)
>>> possible = set(the_range)

>>> {key: possible.difference(key).pop() for key in itertools.product(the_range, repeat=len(the_range)-1)}
{(0, 1): 2, (1, 2): 0, (0, 0): 1, (2, 0): 1, (1, 0): 2, (2, 2): 0, (0, 2): 1, (2, 1): 0, (1, 1): 0}

只要您不期望差异中的特定值,它就应该有效。集合是未排序的,因此set.pop方法将始终从“剩余”值中提供“随机”值。