2017-02-23 7 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); 

私は2つの「更新」を行う場合は、正しい動作が最初の更新で、私は0で、私がすべき次にタプルを持つべきであるということでなければなりませんキー 'hash1'を持つ空の辞書があります。しかし、私はそれを取る実際の行動で:

まず更新:

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

(1で2つの更新はなぜ?)

セカンド更新:

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

(ああこれ!更新は、最初の1正しいのですが、なぜいけないのでしょうか?)

誰かがそのbucleで私を助けることができますか?なぜこの動きがあるのか​​わかりません...私は、くちばしは正しいと思いますが、

ありがとう!

+2

ためpeers_temp = self.peers[key].copy()を変更します。これは非常に悪い習慣です。 –

答えて

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 = list(self.peers[key])

+0

おかげで、ローマが、私はエラーを持っている: は 'デフ(自己、torrent_hash、ピア)アナウンス: ていない場合( '「リスト」オブジェクト「には属性を持っていないが これは、 『コンストラクタ』のコードですcopy'' 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

関連する問題