我有一个排序列表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)
的距离更远的值?
答案 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()]