【问题标题】:How to remove duplicates with different orders from a list?如何从列表中删除具有不同订单的重复项?
【发布时间】:2022-11-22 00:45:13
【问题描述】:

我做了一个特殊的三角形(或者不管它们叫什么)。它工作正常,但一个缺陷是它以不同的顺序打印出相同的三角形。这是代码:

SpecialTriangles = []

for i in range(15):
    for j in range(15):
        for k in range(15):
            if i**2 + j**2 == k**2:
                if i**2 + 0 != k**2:
                    if 0 + j**2 != k**2:   
                        if 0 + 0 != k**2:
                            SpecialTriangles.append([i, j, k])

print(SpecialTriangles)

这就是输出:

[[3, 4, 5], [4, 3, 5], [5, 12, 13], [6, 8, 10], [8, 6, 10], [12, 5, 13]]

所以我希望它按升序打印其中一种:

[[3, 4, 5], [5, 12, 13], [6, 8, 10]]

【问题讨论】:

  • “升序”是否定义为子列表的第一个元素?
  • 0 添加的所有内容是什么?
  • 如果我不将它们添加为 [[0, 0, 0], [0, 1, 1], [0, 2, 2], [0, 3, 3], [0, 4, 4] , [0, 5, 5], [0, 6, 6], [0, 7, 7], [0, 8, 8], [0, 9, 9], [1, 0, 1], [ 2, 0, 2], [3, 0, 3], [3, 4, 5], [4, 0, 4], [4, 3, 5], [5, 0, 5], [6, 0, 6], [7, 0, 7], [8, 0, 8], [9, 0, 9]] 这是我不想要的

标签: python


【解决方案1】:

您正在寻找itertools.combinations

from itertools import combinations

for i, j, k in combinations(range(15), 3):
    # do your logic with i, j, k

正如您所要求的,combinations() 将只给出每个可能的三元组一次。

【讨论】:

    【解决方案2】:

    这是itertools.combinations 的一种可能方式。 iterools.combinations 返回每​​个组合恰好一次的生成器,然后检查您的条件是否符合。

    import itertools
    
    out = list(
        filter(
            lambda x: x[0]**2 + x[1]**2 == x[2]**2, itertools.combinations([*range(15)], 3)
        )
    )
    print(out)
    
    [(3, 4, 5), (5, 12, 13), (6, 8, 10)]
    

    如果您不想使用过滤器,而是列表理解(由于可读性),这是另一种方式:

    out = [x for x in itertools.combinations([*range(15)],3) if x[0]**2 + x[1]**2 == x[2]**2]
    print(out)
    

    【讨论】:

      【解决方案3】:

      正如其他答案所提到的,您正在寻找组合三个元素的集合,即三个索引的集合,不考虑它们的顺序。

      作为让您的代码更“明确”的替代方法,您可以订购索引的三元组并仅在它们不在 SpecialTriangles 中时附加它:

      SpecialTriangles = []
      
      for i in range(15):
          for j in range(15):
              for k in range(15):
                  if (i**2 + j**2) == k**2:
                      if (i**2 + 0) != k**2:
                          if (0 + j**2) != k**2:   
                              if (0 + 0) != k**2:
                                  ordered_triplet = sorted([i, j, k])
                                  if ordered_triplet not in SpecialTriangles:
                                      SpecialTriangles.append(ordered_triplet)
      
      print(SpecialTriangles)
      

      结果如下:

      [[3, 4, 5], [5, 12, 13], [6, 8, 10]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2018-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多