2013-04-04 67 views
2

我有具有緯度和經度信息的數據文件,其餘都存儲爲表格Python中,對一對座標

[(lat1, lon1), (lat1, lon1), (lat2, lon2), (lat3, lon3), (lat3, lon3) ...] 

的元組的列表如以上的連續位置中所示的操作有效的方式( lat,lon)可能是相同的,如果數據文件中的位置沒有改變。因此,這裏的順序非常重要。我感興趣的是檢查座標變化的時間,​​等等,然後得到這兩個座標之間的距離。

我已經有一個函數來獲取返回這些位置之間的計算距離的形式getDistance(lat1, lon1, lat2, lon2)的距離。我想將這些距離存儲在列表中,以後我可以做一些情節。

+0

A.請包括任何相關的代碼。 B.如果我理解正確,你想根據你函數的結果,根據另一個列表中不同元組之間差異結果創建一個列表? C.你的意思是說某些元組(1,1,2,3,3)會有重複嗎?或者應該是(1,2,3,4,5)? – 2013-04-04 08:03:52

+0

我只讀了數據文件,並將其存儲在如圖所示的元組列表中。是的,你是對的,功能已經在那裏。我想要的是通過該列表的方式,當位置發生變化時,將先前位置和新位置傳遞到此函數中。 – sfactor 2013-04-04 08:07:34

+0

請回答/評論A,B和C. – 2013-04-04 08:10:19

回答

5

您可以結合過濾掉重複同一個迭代對的功能:

首先讓照顧消除列表重複隨後的條目。既然我們希望保持順序,並且允許不相鄰的副本,我們不能使用簡單的集合。所以如果我們的座標列表如[(0, 0), (4, 4), (4, 4), (1, 1), (0, 0)]正確的輸出將是[(0, 0), (4, 4), (1, 1), (0, 0)]。完成此簡單的功能是:

def filter_duplicates(items): 
    """A generator that ignores subsequent entires that are duplicates 

    >>> items = [0, 1, 1, 2, 3, 3, 3, 4, 1] 
    >>> list(filter_duplicates(items)) 
    [0, 1, 2, 3, 4, 1] 

    """ 
    prev = None 
    for item in items: 
    if item != prev: 
     yield item 
     prev = item 

yield說法就像一個return實際上並沒有返回。每次調用它時都會將值傳回給調用函數。請參閱What does the "yield" keyword do in Python?以獲得更好的解釋。

這只是遍歷每個項目,並將其與以前的項目進行比較。如果該項目不同,則返回到調用函數並將其存儲爲當前的前一個項目。寫此功能的另一種方式將是:

高清filter_duplicates_2(項): 結果= [] 分組=無 對於項目中的項目: 如果項目=上一個: result.append(項目) prev = item 返回結果

雖然完成同樣的事情,但這樣做最終會需要更多的內存,效率會降低,因爲它必須創建一個新的列表來存儲所有內容。

現在我們已經有辦法確保每一個項目比其鄰國不同,我們需要計算隨後對之間的距離。一個簡單的方法是:

def pairs(iterable): 
    """A generate over pairs of items in iterable 

    >>> list(pairs([0, 8, 2, 1, 3])) 
    [(0, 8), (8, 2), (2, 1), (1, 3)] 

    """ 
    iterator = iter(iterable) 
    prev = next(iterator) 
    for j in iterator: 
     yield prev, j 
     prev = j 

此功能類似於filter_duplicates函數。它只是跟蹤它觀察的前一個項目,並且對它處理它的每個項目生成該項目和前一個項目。它使用的唯一技巧是使用next()函數調用將prev指定到列表中的第一個項目。

如果我們結合兩種功能,我們結束了:

for (x1, y1), (x2, y2) in pairs(filter_duplicates(coords)): 
    distance = getDistance(x1, y1, x2, y2) 
+0

謝謝內森,這是我想要的:)。一些問題,因爲我是Python的初學者。 1.座標的順序是否保存在這裏?2.能否簡單地解釋pairs()函數在這裏做什麼,特別是iter(可迭代)部分? – sfactor 2013-04-04 08:41:27

+1

訂單被保留。我會用解釋更新答案。 :) – 2013-04-04 17:43:42

0

這裏是一種僅使用功能做這個工作從itertools

from itertools import * 

l = [...] 
ks = (k for k,g in groupby(l)) 
t1, t2 = tee(ks) 
t2.next() # advance so we get adjacent pairs 
for k1, k2 in izip(t1, t2): 
    # call getDistance on k1, k2 

這組相鄰相等的元素,然後使用一對tee'd迭代器從組列表中拉出相鄰的對。

只需使用groupby

l = [...] 
gs = itertools.groupby(l) 
last, _ = gs.next() 
for k, g in gs: 
    # call getDistance on (last, k) 
    last = k