我正在遍历字典,如果某些条件匹配,则删除字典项。现在字典动态索引得到更新。
例如
{u'Titanic': {'match': [{'category': u'Book'},
{'category': u'Movie'},
{'category': u'Product'}],
'score': 100}}
在迭代match
时,如果我删除Book
(索引 - 0),那么现在在下一次迭代中,它会直接向我显示product
(索引 - 1),考虑到索引 0 上的movie
。它认为索引 0 已经迭代。
代码截取:
for k1,v1 in enumerate(value['match']):
if k1 != '':
print 'n Category: ',k1,' ',v1['category']
print 'Do you want to change the class of entity',k1 ,'? Y/N', 'Or delete', k1, '1/0'
choice = raw_input()
if choice == 'N' or choice == 'n':
pass
elif choice == 'Y' or choice == 'y' :
print 'tEnter class : t'
v1['category'] = raw_input()
tagged = string.replace(sentence, key, v1['category'])
tagged_ans.append(tagged)
elif choice == '1':
del v1['category']
del value['match'][k1]
在这种情况下,如何在不跳过任何项目的情况下保留当前索引和迭代。在上面的示例中,movie
项被跳过
您可以简单地反向循环访问循环。这样,您可以根据需要从末尾删除元素,这不会替换尚未迭代的元素。
为此,我们可以将您的枚举转换为列表,并用 reversed
包装此列表:
for k1,v1 in reversed(list(enumerate(value['match']))):
if k1 != '':
print 'n Category: ',k1,' ',v1['category']
print 'Do you want to change the class of entity',k1 ,'? Y/N', 'Or delete', k1, '1/0'
choice = raw_input()
if choice == 'N' or choice == 'n':
pass
elif choice == 'Y' or choice == 'y' :
print 'tEnter class : t'
v1['category'] = raw_input()
tagged = string.replace(sentence, key, v1['category'])
tagged_ans.append(tagged)
elif choice == '1':
del v1['category']
del value['match'][k1]
因为我们要将其转换为列表,所以在非常大的序列上使用它时要小心。如有必要,有更有效的方法可以在不创建列表的情况下执行此操作(例如 itertools
)。