2014-11-24 51 views
0

我通过字典迭代,如果某些条件匹配,则删除字典项目。现在字典动态索引得到更新。在删除项目后坚持字典索引

例如

{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可以跳过

+1

你真正的问题是什么? – 2014-11-24 07:09:30

+0

@RikVerbeek:对不起,更新了问题 – puncrazy 2014-11-24 07:16:51

+1

不要删除字典中的键,你正在更新字典并同时增加计数器,这就是为什么指针在第二次迭代中移动到第三项的原因。 – 2014-11-24 07:38:28

回答

1

您可以简单地遍历循环。这样,您可以根据需要从末尾删除元素,而不会替换未迭代的元素。

我们可以通过你的枚举转换到一个列表,并与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)。

+0

谢谢,但得到这个错误:TypeError:参数颠倒()必须是一个序列 – puncrazy 2014-11-24 07:31:04

+0

@puncrazy:请参阅我的编辑。 – grovesNL 2014-11-24 14:56:07