2016-03-07 69 views
0

我有一個元組列表,其中開始是空的,並附加了新的用戶生成的元組。Python:這個列表索引的值是否等於任何其他索引的值?

if left_mouse == True: 
    generic_list.append((mouse_position_x, mouse_position_y)) 

爲了防止具有相同的(X,Y)數據的多個元組,我要通過列表來迭代,並檢查最新的元組是相同的列表中的任何其它元組,並且如果它是,用新的元組替換舊的元組。

for tuple in tuple_list: 
    if tuple_list[-1].position == tuple_list[i].position: 
     tuple_list.remove(i) 

我知道我得到的是錯誤的,但我不知道爲什麼或如何前進。任何幫助將非常感激。

編輯:我現在使用set(),它完美的工作。感謝大家。

+3

你通過列表​​迭代,同時因爲你正在修改它。 – univerio

+3

你爲什麼要用同樣的東西替換它?實際上,你爲什麼要添加它,而不是在添加之前檢查一個相等的元組是否在列表中? –

+0

正如univerio所說的,從你正在迭代的列表中刪除項目是一個壞主意。這個問題顯示了原因:[從列表中刪除項目時出現奇怪的結果](http://stackoverflow.com/q/6260089/4014959)。此外,從列表中刪除項目是一項昂貴的操作,因爲所有後續項目都必須向下移動。順便說一句,你不應該使用'tuple'作爲變量名,因爲它會隱藏內置的'tuple'類型。 –

回答

0

如果訂單無關緊要,您可以使用一套。它只會在你的列表中保留唯一的元組。然後,如果需要,您可以從此集創建一個新列表。例如:

generic_list = [(1,2), (3,4), (1,2), (5,6)] 
generic_list = set(generic_list) # {(1, 2), (3, 4), (5, 6)} 
generic_list = list(generic_list) # [(1, 2), (5, 6), (3, 4)] 
0

我建議使用一組(而非列表):

>>> d = {tuple(RND.sample(range(100), 2)) for c in range(5)} 
>>> d 
{(17, 53), (74, 5), (88, 11), (21, 56), (15, 78)} 
>>> type(d) 
<class 'set'> 

>>> a = (15, 78) 
>>> a in d 
True 
>>> b = (32, 6) 
>>> b in d 
False 
>>> d.add((4, 1)) 
>>> d 
{(74, 5), (15, 78), (17, 53), (88, 11), (4, 1), (21, 56)} 
0

爲了您的具體問題:你是一個叫tuple變量遍歷您tuple_list。這是你應該用什麼來比較:

last_tuple = tuple_list[-1] 
for tuple in tuple_list[:-1]: 
    if tuple.position == last_tuple.position: 
     tuple_list.remove(tuple) 

除非你不應該這樣做,在所有的,因爲你做各種額外的工作。相反,請將set與您的元組列表保持並行,並使用該組來確定您是否曾經看過該位置。 (這裏假設你的列表是幾百或幾千個元素長的。如果你只跟蹤三個,四個位置,你可以只lsearch列表。)

generic_list = [] 
positions_seen = set(generic_list) 

# blah blah blah code 

if left_mouse: 
    pos = (mouse_position_x, mouse_position_y) 
    if pos not in positions_seen: 
     positions_seen.add(pos) 
     generic_list.append(pos) 
+0

它的工作,謝謝! – MGStone