【问题标题】:Compare tuples with elements not in order将元组与不按顺序的元素进行比较
【发布时间】:2017-05-31 19:52:26
【问题描述】:

我有两个字典,我将 bot 转换为 tuples 。两个 dict 包含相同的元素,但它们不是使用相同的逻辑生成的。

例如,假设我有一个这样的元组:

(('a',5),('n',4),('c',8))

第二个元组是这样的:

(('c',8),('n',4),('a',5))

他们的原始字典是这样的(可能,我不知道元素在字典中的排序方式,但是它们是从包含相同元素的两个字典生成的(不多也不少):

{'a':5,'c': 8,'n':4}

对于人类来说,这两个元组都是相似的,但对于计算机来说它们不是。

如何检查两个元组是否相似?

【问题讨论】:

    标签: python dictionary tuples


    【解决方案1】:

    tuple 进行排序并进行比较。例如:

    >>> tuple_1 = (('a',5),('n',4),('c',8))
    >>> tuple_2 = (('c',8),('n',4),('a',5))
    
    # Non-sorted --> unequal; issue you are currently facing
    >>> tuple_1 == tuple_2
    False
    
    # comparing sorted tuples -- equal 
    >>> sorted(tuple_1) == sorted(tuple_2)
    True
    

    如果两个元组的元素都是唯一的,您也可以使用set 来比较它们:

    >>> set(tuple_1) == set(tuple_2)
    True
    

    附带说明,您不必将dict 转换为tuple 即可比较字典的内容。您可以直接将dict 对象比较为:

    >>> {1: 2, 3: 4} == {3: 4, 1: 2}
    True
    

    【讨论】:

      【解决方案2】:
      def similarTuple(a,b):
          h = {}
          for e in a:
              h[e] = True
          for e in b:
              if e not in h:
                  return False
          return True
      

      【讨论】:

        【解决方案3】:

        您还可以将元组转换为dict,然后进行比较。

        不确定这是否更快/更慢/与排序相同。

        dict(t1) == dict(t2)
        

        【讨论】:

        • 它将比sorted 更快,因为从元组创建字典的复杂度将是N。但是,如果元组中的两个元素在索引 0 处具有相同的对象,这将失败。但同样,由于 OP 正在从 dict 创建 tuple,这足以满足他的要求。但不适用于以广义方式比较元组的其他人。
        【解决方案4】:

        您还可以创建一组两个元组并比较它们:

        a = (('a', 0), ('b', 1), ('c', 2))
        b = (('b', 1), ('a', 0), ('c', 2))
        set(a) == set(b)
        

        【讨论】:

        • 如果同一个元组出现超过 1 次,则将不起作用。
        【解决方案5】:

        尝试单行,探索从列表推导中获得布尔结果

        效率不高,可能很有趣

        def SameElementsP(a,b):
            return not ( [1 for e in a if e not in b] or [1 for e in b if e not in a] )    
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-07
          • 2021-01-23
          相关资源
          最近更新 更多