def distanceFromGPS(latitude1,longitude1,latitude2,longitude2):
R = 6371
dLat = math.radians(latitude2-latitude1)
dLon = math.radians(longitude2-longitude1)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(math.radians(latitude1)) * math.cos(math.radians(latitude2))
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = R * c
return d
a = [(1,1),(4,4),(1.001,1),(1,1.001),(1.0000001,1),(1,1.0000000001)]
lst=[]
for L in range(0, len(a)+1):
for subset in itertools.combinations(a, L):
if len(subset) == len(a):
for i in range(0,len(a)):
for j in range(1,len(a)):
if distanceFromGPS(subset[i][0],subset[i][1],subset[j][0],subset[j][1]) < 1:
del(subset[j])
lst.append(subset[i])
print len(set(lst))
如果它们之间的距离小于1km,我试图删除所有的lat long对,只保留其中一个,例如在元组a列表中,它们都是经纬度对。除(4,4)外,其余所有设备之间的距离均小于1 km。所以我只希望其中一个出现在print len(set(lst))
中,使代码打印2。函数distanceFromGPS
返回两个lat long对之间的距离(km)。我写的代码不起作用,应该有比使用四个for循环更好的方法!请帮忙。在
touple是不可变的,所以你不能用“del”删除其中一个条目。在
您可以这样做:
另一种方法是使用列表(它是可变的,与“del”一起工作)而不是touples。虽然这会导致性能下降。在
另外,如果要从list/touple/array中删除,则应该从头到尾迭代它(这意味着最后一个for循环应该更改)。如果你不去检查下一个项目,你就要删除它了。在
这段代码应该使用更少的循环。在
^{pr2}$我认为一个简单的解决办法是:
相关问题 更多 >
编程相关推荐