从列表中删除重复的无序元组

时间:2018-02-02 20:18:36

标签: python list tuples itertools

在元组列表中,我想只有一个元组的副本,它可能是(x,y)或(y,x)。

所以,在:

... "[value] = #" & t.value & "# ...

结果应该是:

# pairs = list(itertools.product(range(3), range(3)))
pairs = [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

这个元组列表是使用itertools.product()生成的,但我想删除重复项。

我的工作解决方案:

result = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)] # updated pairs

如何改进?

3 个答案:

答案 0 :(得分:4)

您可以使用combinations_with_replacement

  

combination_with_replacement()的代码也可以表示为product()的子序列,它过滤了元素不按排序顺序排列的条目(根据它们在输入池中的位置)

import itertools
pairs = list(itertools.combinations_with_replacement(range(3), 2))
print(pairs)

>>> [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]

答案 1 :(得分:1)

这是一个依赖sparse matrices的解决方案。这有以下原因:

矩阵中的条目不能包含两个值。因此,保证了唯一性。

选择上三角形可确保(0,1)优先于(1,0),并且不可能包含两者。

import numpy as np
from scipy.sparse import csr_matrix, triu

lst = [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1),
       (1, 2), (2, 0), (2, 1), (2, 2)]

# get row coords & col coords
d1, d2 = list(zip(*lst))

# set up sparse matrix inputs
row, col, data = np.array(d1), np.array(d2), np.array([1]*len(lst))

# get upper triangle of matrix including diagonal
m = triu(csr_matrix((data, (row, col))), 0)

# output coordinates
result = list(zip(*(m.row, m.col)))

# [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]

答案 2 :(得分:0)

编辑我刚刚意识到,您的解决方案符合我的解决方案。你做的很好。如果您需要为非常大的列表执行此操作,那么您可能需要查看其他一些选项,例如键值存储。

如果你需要以编程方式删除dupes,那么你可以使用这样的函数:

def set_reduce(pairs):
    new_pairs = set([])
    for x,y in pairs:
        if x < y:
            new_pairs.add((x,y))
        else:
            new_pairs.add((y,x))
    return new_pairs

运行此结果

>>>set_reduce(pairs)
set([(0, 1), (1, 2), (0, 0), (0, 2), (2, 2), (1, 1)])