【问题标题】:Creating dictionary with tuple keys with a loop使用循环创建带有元组键的字典
【发布时间】:2017-07-08 19:52:59
【问题描述】:

我正在尝试创建一个以元组为键的字典。

例如,如果我的范围是 (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)

创建的字典:

{(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。不过我只需要一个。

【问题讨论】:

  • 您的组合带有替换,因此在大多数情况下,元组中不包含多个
  • 我不明白。范围总是(0, x) 的形式吗?并且元组的长度总是x-1?
  • 你能提供一个完整的例子吗?和@Rawing 一样,我仍然对你到底在问什么感到困惑。
  • 提供了完整的例子

标签: python dictionary


【解决方案1】:

使用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 方法总是会从“剩余”值中给出一个“随机”值。

【讨论】:

  • 既然可以possible.difference(k).pop(),为什么还要创建迭代器
  • @MosesKoledoye 谢谢你的建议。那绝对更干净。
猜你喜欢
  • 2020-06-20
  • 2018-04-18
  • 2016-06-08
  • 2023-01-17
  • 2013-08-06
  • 2019-11-23
  • 1970-01-01
  • 2020-05-18
  • 2017-07-18
相关资源
最近更新 更多