在python中获取列表中的所有唯一对,包括重复项

Posted

技术标签:

【中文标题】在python中获取列表中的所有唯一对,包括重复项【英文标题】:Get all unique pairs in a list, including duplicates, in 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)

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

【问题讨论】:

一种方法是创建第二个列表,它是一个列表列表,循环遍历原始列表,同时将其与自身进行比较,如果第二个列表中不存在该对,则将其添加到那里。 【参考方案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)]

【讨论】:

以上是关于在python中获取列表中的所有唯一对,包括重复项的主要内容,如果未能解决你的问题,请参考以下文章

从列表中获取唯一项目[重复]

如何在 python 中使用 pandas 获取所有重复项的列表?

获取嵌套数组/对象的数组中的所有唯一值(删除重复项)

Vuejs - 如何使用 v-for 获取数组中的所有唯一值(删除重复项)

从python列表中获取元素的唯一组合[重复]

python删除列表中的重复元素并保持相对顺序不变