【问题标题】:Going back and forth between sets and tuples in python在python中的集合和元组之间来回切换
【发布时间】:2020-07-14 15:04:46
【问题描述】:

我有一个字典,假设有 n 行,其中每一行我有一堆值和元组作为键。像这样的:

a = {(-1,2):40, (4,5):10, (-6,1):20, (2,-3):30, ...}

现在假设我有另一本这样的字典:

b = {(4,5):10, (-6,1):20, (-1,2):40, (2,-3):30, ...}

所以基本上ba 但元素的顺序不一样。问题是我想不出一个好方法来检查这个。我不能使用集合作为键并快速确认a == b,如果我将元组作为键然后a == b is false,因为订单被打乱了。我试过tuple(set())他们,也没有用。所以我正在考虑将键保留为tuple(set()),在中间步骤中对它们进行“untuple”,检查并将它们元组返回。我认为解包在这里没有帮助,因为我不想混合元组中的内容,例如 (4,5,-6,1,...) 我最终想要做的是看看我是否已经有了我字典中的这种元组组合,无论元素如何排序。

如果我不能说清楚,请告诉我, 我是编程菜鸟,所以是的, 谢谢。

【问题讨论】:

  • 字典比较从未使用键的顺序。 {1:2, 3:4} == {3:4, 1:2}。在 Python 3 中,{1:2, 3:4}.keys() == {3:4, 1:2}.keys() 也是如此,因为 keys 方法不返回列表。
  • 您能提供一些预期的输出示例吗?假设您有is_equal(dict_a, dict_b),那么相同的组合键但不同的值将是什么输出?

标签: python dictionary set tuples


【解决方案1】:

您做错了其他事情,字典中的顺序无关紧要...

In [1]: x = {(1,2):3, (4,5):6}                                                                                                            

In [2]: y = {(4,5):6, (1,2):3}                                                                                                            

In [3]: x == y                                                                                                                            
Out[4]: True

【讨论】:

    【解决方案2】:

    您可以规范化两个字典中的元组以执行比较:

    def normalized(d): return { tuple(sorted(k)):v for k,v in d.items() }
    
    if normalized(a) == normalized(b):
        ...
    

    请注意,这不是很有效,您应该考虑在程序的其余部分使用规范化键(即在读取/接收数据时尽早规范化数据)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2019-10-17
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多