删除项目后保留字典索引



我正在遍历字典,如果某些条件匹配,则删除字典项。现在字典动态索引得到更新。

例如

{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 )。

最新更新