2017-02-23 24 views
0

我有一個Python中的字典,裏面有一個元組列表。 它的一個例子是:使用Python中的元組閱讀字典

peers = {'hash1': [('bot2', 1), ('bot1', 1)]} 

我想做一個所謂的「更新」是把所有的字典,如果在元組有一個數字一個功能,變爲0,如果是0,刪除元組。

,我實現的bucle是這樣的:

def update(self): 
     for key in self.peers.keys(): 
      for tup in self.peers[key]: 
       print "--" 
       print tup 
       if 0 in tup: 
        self.peers[key].remove(tup) 
       else: 
        newTup = (tup[0], 0) 
        self.peers[key].remove(tup) 
        self.peers[key].append(newTup); 

如果我做兩個「更新」,正確的行爲應該是在第一次更新,我應該爲0,並在接下來的我應有的元組有一個關鍵字爲'hash1'的空字典。但在現實的行爲,我把它:

首先更新:

peers = {'hash1': [('bot1', 1)]} 

(在一兩個更新嗎?爲什麼?)

二更新:

peers = {'hash1': [('bot1', 0)]} 

(哦,這更新是正確的,但爲什麼不是第一個?)

有人可以幫我那個叔叔嗎?我不知道它爲什麼會有這種行爲...我認爲這種行爲是正確的,但是..

謝謝!

+2

,你去通過它,你正在修改的列表。這是非常糟糕的做法。 –

回答

0

Like Ev。 Kounis說 - 你不應該嘗試修改你迭代的列表。

你可以這樣來做:

def update(self): 
    for key in self.peers.keys(): 
    peers_temp = self.peers[key].copy() 
    for tup in self.peers[key]: 
     print("--") 
     print(tup) 
     if 0 in tup: 
     peers_temp.remove(tup) 
     else: 
     newTup = (tup[0], 0) 
     peers_temp.remove(tup) 
     peers_temp.append(newTup); 
     self.peers[key] = peers_temp 

@Edit:它的工作原理爲Python 3.對於舊版本的改變peers_temp = self.peers[key].copy()peers_temp = list(self.peers[key])

+0

感謝羅馬,但我有一個錯誤: '「名單」對象有沒有屬性「copy'' 這是‘構造’的代碼: '高清宣佈(個體經營,torrent_hash,同行): 如果不是( self.peers.has_key(torrent_hash)) self.peers [torrent_hash] = [] TUP =(對等體,1) self.peers [torrent_hash] .append(TUP)' 有一些像「複製方法( )'列表? – msabate

+0

好的,我的代碼適用於python3。只需將peers_temp = self.peers [key] .copy()更改爲peers_temp = list(self.peers [key]) –

+0

哦,太棒了!現在它工作了!我把你的答案作爲接受,我編輯舊版本的Python。 謝謝! – msabate