【问题标题】:Remove simultaneity from list of tuples from list of tuples从元组列表中删除元组列表中的同时性
【发布时间】:2020-06-28 12:30:26
【问题描述】:

我正在尝试以一种快速有效的方式来做到这一点

输入:

a = [(1,0),(2,3),(0,1),(4,6),(3,2)]

做点什么: 我知道 (1,0) 不等于 (0,1) 但在我的应用程序中我只需要其中一个

因为我有超过 6194913 个元素,所以运行应用程序需要很长时间

输出:

a = [(1,0),(2,3),(4,6)]

【问题讨论】:

  • 输出应该保持第一次遇到吗?即(1,0) 而不是(0,1)?

标签: python python-3.x list tuples


【解决方案1】:

一种可能的方式:

a = [(1,0),(2,3),(0,1),(4,6),(3,2)]
a = list(set([tuple(sorted(item)) for item in a]))
print(a) #[(0, 1), (2, 3), (4, 6)]
  1. a中的每个元组进行排序(将(g, f)转换为(f, g)但保留(f, g)f )
  2. 强制转换为 set 以删除重复项
  3. set 转换回list

tuple 演员表是为了确保可散列性,因为 sorted 转换为 listlists 是不可散列的。

>>> sorted((1, 0)) #converts to list
[0, 1]
>>> 

【讨论】:

    【解决方案2】:

    您需要删除重复项,我们可以在这里使用set

    但是,我们需要找到一种方法来确定元组是否等于它们的反转形式,例如(1, 0) 等于(0, 1)。如果我们对此进行测试,我们会意识到它们本身是相等的:

    >>> (1, 0) == (0, 1)
    False
    

    @A.J. Uppal 的另一个答案所示,我们可以在进行相等性检查之前排序元组:

    >>> tuple(sorted((1, 0))) == tuple(sorted((0, 1)))
    True
    

    这表明根据我们的标准,元组相等

    此外,集合需要 hashable(不可变)类型,因此可以在此处使用元组。可变类型是可散列的,不能与set一起使用。

    我们可以在这里使用的另一种可散列类型是frozenset

    >>> frozenset((1, 0)) == frozenset((0, 1))
    True
    

    这可以用来删除任何个重复项:

    >>> a = [(1,0),(2,3),(0,1),(4,6),(3,2)]
    >>> set(frozenset(t) for t in a)
    {frozenset({0, 1}), frozenset({4, 6}), frozenset({2, 3})}
    >>> [tuple(s) for s in set(frozenset(t) for t in a)]
    [(0, 1), (4, 6), (2, 3)]
    

    但是,以上内容并不能维持秩序。如果我们想保持顺序,我们可以使用 set 来跟踪重复:

    a = [(1,0),(2,3),(0,1),(4,6),(3,2)]
    
    seen = set()
    result = []
    
    for tup in a:
        fs = frozenset(tup)
        if fs not in seen:
            result.append(tup)
            seen.add(fs)
    
    print(result)
    

    这给出了这个有序输出:

    [(1, 0), (2, 3), (4, 6)]
    

    注意:使用frozenset就是O(n),比O(nlogn)排序效率更高。对于较大的列表,我建议使用frozenset

    【讨论】:

      【解决方案3】:
      sample = [(1, 0), (2, 3), (0, 1), (4, 6), (3, 2)]
      result = set()
      
      for first, second in sample:
          if (first, second) not in result and (second, first) not in result:
              result.add((first, second))
      
      result = list(result)
      print(result)
      

      输出:

      [(1, 0), (2, 3), (4, 6)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多