在元组列表中,我想只有一个元组的副本,它可能是(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
如何改进?
答案 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)])