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))
如果它们之间的距离小于1 km,我试图删除所有lat长对,只保留其中一对,例如在元组列表a中,它们都是纬度经度对。除(4,4)以外的所有距离均小于1 km。所以我只希望其中一个出现在print len(set(lst))
中,使代码打印2.函数distanceFromGPS
返回两个lat长对之间的距离(km)。我写的代码不起作用,应该有比使用四个for循环更好的方法!请帮忙。
答案 0 :(得分:1)
Touples是不可变的,所以你不能使用&#34; del&#34;删除他们的一个项目。
您可以这样做:
mytouple = mytouple[:indexToDelete] + mytouple[indexToDelete+1:]
另一种方法是使用列表(它们是可变的并与#34; del&#34;一起使用)而不是操作。虽然这会导致性能下降。
另外,如果要从list / touple / array中删除,则应该从end到start迭代它(这意味着你的最后一个for循环应该改变)。这是因为如果你真的删除了一个项目,你的循环就不会检查下一个项目并跳过它。
此代码应该使用较少的循环。
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)]
for i in range(len(a)-1,-1,-1):
for j in range(len(a)-1,i, -1):
if distanceFromGPS(a[i][0],a[i][1],a[j][0],a[j][1]) < 1:
a = a[:j] + a[j+1:]
print(set(a))
答案 1 :(得分:0)
我认为一个简单的解决方案如下:
from itertools import product
a = [....]
results = set()
for pair in product(a, a):
left, right = pair
if distanceFromGPS(left[0], left[1], right[0], right[1]) > 1:
results.add(left)