在Python中浏览元组字典
我有一本Python字典,里面有一个元组列表。 例如:在Python中浏览元组字典,python,dictionary,tuples,Python,Dictionary,Tuples,我有一本Python字典,里面有一个元组列表。 例如: peers = {'hash1': [('bot2', 1), ('bot1', 1)]} 我想做一个名为“update”的函数,它会获取所有的字典,如果元组中有一个数字1,则变成0,如果是0,则删除元组 我实现的循环是: def update(self): for key in self.peers.keys(): for tup in self.peers[key]:
peers = {'hash1': [('bot2', 1), ('bot1', 1)]}
我想做一个名为“update”的函数,它会获取所有的字典,如果元组中有一个数字1,则变成0,如果是0,则删除元组
我实现的循环是:
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)]}
(哦!这个更新是正确的,但为什么不是第一个呢?)
有人能帮我打那个圈吗?我不知道它为什么会有这种行为。。。我认为这个循环是正确的,但是
谢谢 像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
@编辑:它适用于Python3。对于较旧的版本,请更改
peers\u temp=self.peers[key].copy()
对于peers\u temp=list(self.peers[key])
您正在修改列表。这是非常糟糕的做法。谢谢Roman,但我有一个错误:'list'对象没有属性“copy”
这是“构造函数”的代码:def announce(self,torrent\u hash,peer):如果没有(self.peers.has\u key(torrent\u hash))self.peers[torrent\u hash]=[]tup=(peer,1)self.peers[torrent\u hash],append(tup)
对于列表有一些类似“copy()”的方法吗?好的,我的代码适用于python3。只需将行peers\u temp=self.peers[key].copy()更改为peers\u temp=list(self.peers[key])哦,太好了!现在它工作了!我将您的答案作为已接受答案,并为Python的旧版本进行编辑。谢谢