2011-05-26 35 views
0

你好,我有一個循環來計算我的MySQL數據庫中的不同記錄,然後將數字保存到列表中。這裏是清單:
[1L, 2L, 2L, 5L, 4L, 1L, 1L, 1L, 3L, 1L, 1L, 2L, 2L, 3L, 3L, 1L, 2L, 4L, 2L, 1L, 3L, 1L, 2L, 4L, 1L, 2L, 1L, 1L, 3L, 1L, 3L, 1L, 5L, 2L, 1L, 1L, 5L, 1L, 1L, 1L, 4L, 2L, 1L, 3L, 2L, 1L, 2L, 2L, 2L, 3L, 1L, 1L, 3L, 2L, 2L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 3L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L]清理我的清單

現在我去通過這個名單,我想只留下一個數字(指1L,2L等)我使用這個循環:

for number in legend: 
     print number # to check what number it does currently 
     counter = legend.count(number) 
     while counter > 1: 
      legend.remove(number) 
      counter -= 1

然後我看到它檢查1,2,3,4,3,2,1 ...爲什麼是這樣?爲什麼這個循環不會檢查數字5?最後列表看起來像這樣:
[5L, 5L, 5L, 4L, 3L, 2L, 1L]

這意味着它的工作原理,但它爲什麼不去5號?提前

+9

您正在遍歷'legend'並在循環中刪除元素。你不應該修改你正在迭代的序列。 – 2011-05-26 09:52:56

+0

thx有意義的人^^ – 2011-05-26 09:54:53

+1

這不是一個好辦法,因爲你的算法是O(n^2)。您遇到的問題是您在循環播放時正在修改'legend「。 – 2011-05-26 09:55:29

回答

7

THX只是把它放在一個set

>>> foo = [1,1,1,2,2,3,3,4,1,4,3,6,5,6] 
>>> set(foo) 
set([1, 2, 3, 4, 5, 6]) 

這會自動過濾掉所有重複項。也許你甚至可以跳過這個列表,並把它放在一個set首先。

+0

呃這比預期容易^^我正在尋找一些其他(更難)的錯誤...感謝它解決了我的問題...將檢查這個答案,但需要等待12分鐘這樣做^^ – 2011-05-26 09:51:00

+0

有沒有訪問set()中每個數字的方法?它給了我一個錯誤,該集合是無法索引的 – 2011-05-26 09:58:10

+0

@Tomasz:要做到這一點,你必須將它轉換回列表:'list(set(legend))'。請記住,這可能會改變項目的順序。 – 2011-05-26 09:59:42

0

你可能會陷入問題,如:

list = [1,2,3,4] 
for l in list: 
    print "Elem ", l 
    if l == 2: 
     list.remove(1) 

這使輸出:

Elem 1 
Elem 2 
Elem 4 

列表中循環被修改,並在除去你已經通過你跳過環的一些元素列表中的一個元素。

+0

是的,我注意到...我用「爲集(列表)」和工作 – 2011-05-26 10:11:06