【问题标题】:Appending frozensets to a dictionary将frozensets附加到字典
【发布时间】:2019-07-12 11:55:46
【问题描述】:

我正在处理一段代码(用 python 编写),它接受以下形式的参数:

restricted_bonds = {
    frozenset((0, 10)),
    frozenset((3, 14)),
    frozenset((5, 6))
}

我有一个形式的元组:

tupl = ((0, 5, 6, 1), (4, 5, 6, 8))

在哪里,我想创建一个可以读作的frozenset:

d = {frozenset((0, 5, 6, 1)),
     frozenset((4, 5, 6, 8))
}

这个想法是能够设置restricted_bonds = d

我尝试了以下几种变体:

for i in tupl:
    d[frozenset(i)] = ''

理想的结果是:

d = {frozenset((0, 5, 6, 1)),
     frozenset((4, 5, 6, 8))
}

【问题讨论】:

  • 你没有字典,你有一个集合
  • frozenset 不是“人工制品”,它是内置的,在这种情况下可能选择它是因为它是可散列的(与 set 不同),因此可以插入到 set 或用作dict
  • @MartijnPieters,我现在已按照建议将 set 重命名为 freezeset。
  • @Wychh:虽然这不是一个有用的编辑。您的预期输出不是frozenset 本身,而是一个常规(可变)set() 对象。

标签: python python-3.x set frozenset


【解决方案1】:

你没有字典。你有set objects;特别是包含frozenset() 对象的set() 对象。这些不是人工制品,代码必须明确选择使用这些对象。请参阅section on sets in the Python tutorial

frozenset() 对象只是不可变的集合;存储在集合中的值必须是可散列的,并且可散列要求存储的对象是不可变的(*)set()frozenset() 都是内置类型,如 strlisttuple,您可以直接使用它们而无需导入。

只需使用set.add() method 来添加单个值,使用set.update()|= 扩充分配来为您的集合添加更多元素。

如果您只想从任意数量的元组创建一个新集合,请使用集合推导(在教程的同一部分中涉及):

tupl = ((0, 5, 6, 1), (4, 5, 6, 8))
d = {frozenset(t) for t in tupl}

(*):准确的说:用来判断相等的对象的状态也必须用来判断hash(相等的对象必须有相同的hash),hash必须保持稳定。可以随意更改与不用于确定相等性的对象关联的其他属性。

【讨论】:

  • d = {frozenset(t) for t in tupl} 似乎给了我:{frozenset({2, 10, 6, 7}), frozenset({38, 34, 35, 30})} 而不是:{frozenset((2, 10, 6, 7)), frozenset((38, 34, 35, 30}))} {}() 的变化是一个微妙的区别,但似乎有所不同。有什么建议会很棒吗?另外,感谢您的原始回复。
  • @Wychh:完全正确。您不能拥有 frozenset((2, 10, 6, 7)) 对象。集合是无序的,不是元组。 frozenset() 对象的表示通过在打印时向您显示设置符号来反映这一点。
  • @Wychh:如果对象必须排序,不要使用frozenset(),直接将元组放在外部集合中。您可以通过 set(tupl) 一步完成。
猜你喜欢
  • 2023-02-24
  • 2012-02-14
  • 2018-12-27
  • 2016-12-30
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多