从元组

时间:2016-07-13 04:45:01

标签: python python-2.7

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循环更好的方法!请帮忙。

2 个答案:

答案 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)