您可以結合過濾掉重複同一個迭代對的功能:
首先讓照顧消除列表重複隨後的條目。既然我們希望保持順序,並且允許不相鄰的副本,我們不能使用簡單的集合。所以如果我們的座標列表如[(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)
A.請包括任何相關的代碼。 B.如果我理解正確,你想根據你函數的結果,根據另一個列表中不同元組之間差異結果創建一個列表? C.你的意思是說某些元組(1,1,2,3,3)會有重複嗎?或者應該是(1,2,3,4,5)? – 2013-04-04 08:03:52
我只讀了數據文件,並將其存儲在如圖所示的元組列表中。是的,你是對的,功能已經在那裏。我想要的是通過該列表的方式,當位置發生變化時,將先前位置和新位置傳遞到此函數中。 – sfactor 2013-04-04 08:07:34
請回答/評論A,B和C. – 2013-04-04 08:10:19