从tup中删除

2024-04-16 18:00:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: in距离forlenrangemathsinsubset
2条回答

touple是不可变的,所以你不能用“del”删除其中一个条目。在

您可以这样做:

mytouple = mytouple[:indexToDelete] + mytouple[indexToDelete+1:]

另一种方法是使用列表(它是可变的,与“del”一起工作)而不是touples。虽然这会导致性能下降。在

另外,如果要从list/touple/array中删除,则应该从头到尾迭代它(这意味着最后一个for循环应该更改)。如果你不去检查下一个项目,你就要删除它了。在

这段代码应该使用更少的循环。在

^{pr2}$

我认为一个简单的解决办法是:

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)

相关问题 更多 >