如何在列表中找到重复项,并删除除特定重复项之外的所有重复项?

时间:2017-06-07 04:02:55

标签: python

我有一个排序列表dataPts,它根据每个点与minY中的最小Y值dataPts进行排序,例如[(0, 0), (10, 10), (20, 20) ... ](0, 0)是minY

然后我创建一个新列表angles,它是所有这些角度的列表,例如[0, 45, 45, ...]

您会注意到angles包含重复值,例如45, 45,。我想要做的是找到共享相同角度的dataPts中的点。然后我想删除那些点,除了使用返回值的函数离minY最远的那个点。

例如,(10, 10)(20, 20)都在angles中具有相应的值,即45。如何选择minY距离为(20, 20)并删除(10, 10)的距离更远的值?

2 个答案:

答案 0 :(得分:1)

试试这个

angles1 = [(0, 0), (10, 10), (20, 20)]
angles = [0, 45, 45]
dumy = {}
duplicates = []
for i,items in enumerate(angles):
    if (items not in dumy):
        dumy[items] = ""
    else:
        duplicates.append(i)
        if((angles[i-1] == items) and i-1 not in duplicates):
            duplicates.append(i-1)


for i in (duplicates):
    del angles1[i] 

假设您要删除唯一的重复项,请尝试以下代码

for i,items in enumerate(angles):
    if (items not in dumy):
    dumy[items] = ""
    else:
    duplicates.append(i)
    del angles1[i] 
    if((angles[i-1] == items) and i-1 not in duplicates):
        del angles1[i-1]        

答案 1 :(得分:1)

你可以使用角度作为键来创建一个dict,其中值是具有给定角度的所有元素,然后根据距离函数选择最大值。

即。类似的东西:

d = defaultdict(lambda: [])

for angle, pt in zip(angles, dataPts):
    d[angle].append(pt)

result = [max(pt, key=my_dist_func) for angle, pt in d.items()]

考虑到你所描述的ymin和距离函数,我认为这有效:

from collections import defaultdict

dataPts = [(0, 0), (10, 10), (20, 20) ]
angles = [0,45,45]
ymin = min((p[1] for p in dataPts))

d = defaultdict(lambda: [])

for angle, pt in zip(angles, dataPts):
    d[angle].append(pt)

result = [max(pt, key=lambda p: p[1]-ymin) for angle, pt in d.items()]