在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 获取所有重复项的列表?