【问题标题】:Efficient Way of making a set of tuple in which the order of tuple doesn't matters制作一组元组的有效方法,其中元组的顺序无关紧要
【发布时间】:2018-12-07 11:23:17
【问题描述】:

我想创建一组元组,其中元组的顺序无关紧要。 例如-如果我要添加的元组是:

[(1,2),(1,3),(2,1)]

应该这样输出:

{(1,2),(1,3)}

在 python 中有什么有效的方法吗?

【问题讨论】:

  • 把元组变成frozensets?
  • @Aran-Fey 的问题是,如果元组有像 l = [(1,1,2),(2,1,1)] 这样的重复,那么元组本身将被更改,因为冻结集(和普通集)不允许重复

标签: python python-3.x list set tuples


【解决方案1】:

你也可以使用理解:

l=[(1, 2), (1, 3), (2, 1)]
res={ tuple(sorted(t)) for t in l }
print(res)
{(1, 2), (1, 3)}

【讨论】:

    【解决方案2】:

    你可以先申请sorted再申请tuple,再转换成set

    res = set(map(tuple, map(sorted, L)))
    
    print(res)
    
    {(1, 2), (1, 3)}
    

    说明

    您不应该将每个元组转换为 set 作为初始步骤有几个很好的理由:

    1. 元组(1, 1, 2)(1, 2) 将在转换为set 后变得相等。
    2. 即使在我们考虑长度为 2 的元组的情况下,我们也会添加 tuple({(1, 2)})tuple({(2, 1)}) 相等的假设。虽然这可能是真的,但它会被视为实现细节,因为 set 被认为是无序的。

    函数构成

    函数组合不是 Python 原生的,但如果您可以访问第 3 方 toolz 库,则可以避免嵌套 map

    from toolz import compose
    
    tup_sort = compose(tuple, sorted)
    
    res = set(map(tup_sort, L))
    

    【讨论】:

    • 我可以问一下您为什么只使用集合删除其他解决方案?实际上我认为那会更好
    • @Netwave,因此使用set 然后tuple 假定{1, 2} 转换为元组将始终给出(1, 2)。虽然这可能为真,但不应假定集合是无序的。如果集合是随机排序的,您可以让一个{1, 2} 设置给(1, 2),另一个给(2, 1)。使用sorted + tuple 少了一个假设。
    • @Netwave 我认为在这里使用集合(或frozensets)的最佳理由是删除重复项,例如{1,2,2} == {1,2}
    【解决方案3】:

    您可以对元组进行排序:

    l = [(1,2),(1,3),(2,1)]
    res = set(map(lambda x: tuple(sorted(x)), l))
    print(res)
    {(1, 2), (1, 3)}
    

    【讨论】:

      【解决方案4】:

      其他答案都有效!我只是将我的发布在这里,因为我是初学者并且我喜欢练习。

      mainSet = set()
      l = [(1,2),(1,3),(2,1)]
      
      for i in l:
      
          if tuple(sorted(i)) not in mainSet:
      
              mainSet.add(tuple(sorted(i)))
      
      print(mainSet)
      

      回馈

      {(1, 2), (1, 3)}

      您是否要使用它取决于您!其他答案要短得多。

      【讨论】:

        猜你喜欢
        • 2016-02-07
        • 2018-05-19
        • 2011-12-11
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多