2017-02-23 88 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] = [] стро = (равный, 1) self.peers [torrent_hash] .append (стро) ' Существует некоторый метод, как«копия () 'для списков? – msabate

+0

Хорошо, мой код работает для python3. Просто измените строку peers_temp = self.peers [key] .copy() на peers_temp = list (self.peers [key]) –

+0

О, хорошо! Теперь это работает! Я положил ваш ответ как принятый, и я редактирую старые версии для Python. Спасибо! – msabate

Смежные вопросы