【问题标题】:Get all unique pairs in a list, including duplicates, in python在python中获取列表中的所有唯一对,包括重复项
【发布时间】:2022-01-21 13:55:34
【问题描述】:

如何获取列表中的所有唯一对,允许重复?

例如对于列表[20, 20, 19],我想要(20, 20)(20, 19)

对于[20, 20, 19, 19, 18],我想要(20, 20)(20, 19)(20, 18)(19, 19)(19, 18)

我并不介意返回什么对象(列表、元组、字典、集合等),只要我可以遍历每一对并提取两个数字

【问题讨论】:

  • 一种方法是创建第二个列表,它是一个列表列表,循环遍历原始列表,同时将其与自身进行比较,如果第二个列表中不存在该对,则将其添加到那里。

标签: python-3.x list


【解决方案1】:

您可以在set comprehension 中使用itertools.<b>combinations</b>

>>> from itertools import combinations
>>> lst_1 = [20, 20, 19]
>>> {comb for comb in combinations(lst_1, r=2)}
{(20, 19), (20, 20)}
>>> lst_2 = [20, 20, 19, 19, 18]
>>> {comb for comb in combinations(lst_2, r=2)}
{(20, 20), (19, 19), (20, 19), (19, 18), (20, 18)}

或者直接转换成一个集合:

>>> set(combinations(lst_1, r=2))
{(20, 19), (20, 20)}
>>> set(combinations(lst_2, r=2))
{(20, 20), (19, 19), (20, 19), (19, 18), (20, 18)}

【讨论】:

    【解决方案2】:

    您可以使用双 for 循环,在每次迭代中,前一个元素都会被删除。我认为这个解决方案会比itertools.combinations 方法更快,尤其是在列表很大的情况下,因为它不必先找到所有组合。

    def get_pairs(l):
        out = []
        for i in l:
            l.remove(i)
            for j in l:
                if (i,j) in out or (j,i) in out:
                    continue
                else:
                    out.append((i,j))
        return out
    

    输出:

    >>> get_pairs([20, 20, 19, 19, 18])
    
    [(20, 20), (20, 19), (20, 18), (19, 19), (19, 18)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多