2017-08-07 178 views
0

价值的关键和List字典我有字典与主要作为“字符串”和值的整数列表蟒蛇。用键和值迭代字典,如果它不符合某些条件,则删除列表中的值。 迭代不正确。迭代与蟒蛇

例如,

my_dict = {"emp_id":[100,200]} 

for emp,ids in my_dict.iteritems(): 
    print "Emp :",emp 
    for id in ids: 
     print "Id :",id 
     if not id > 1000: 
      my_dict.get(emp).remove(id) 
      continue 

输出:

Emp : emp_id 
Id : 100 

它不遍历该列表中的第二值(200)。不知道什么可能是问题。 是否应该删除字典中的值。

如何解决这个问题。我们是否需要复制到另一个对象并从中移除。

+4

问题是你正在改变列表。 –

+1

另外,没有理由在内部循环中调用'mydict.get';你已经*有*对该列表的引用,'ids'。 – chepner

+1

另外,循环结尾处的“继续”是不必要的。 –

回答

2

不应删除元素不能可靠地修改过你所迭代的列表。只需过滤列表,然后将其替换为过滤后的副本。

for emp, ids in mydict.iteritems(): 
    print "Emp:", emp 
    new_ids = [] 
    for id in ids: 
     print "Id", id 
     if id > 1000: 
      new_ids.append(id) 
    my_dict[emp] = new_ids 

如果不打印每个ID,你看到它,你可以替换单个呼叫内环到filter

for emp, ids in my_dict.iteritems(): 
    my_dict[emp] = [id for id in ids if id > 1000] 
    # my_dict[emp] = filter(lambda x: x > 1000, ids) 

你甚至可以从头开始重建整个dict

my_dict = {emp: [id for id in ids if id > 1000] for emp, ids in my_dict.iteritems()} 
-1

这不是很好的迭代过程中修改my_dict。

如果你只想打印:没有(ID> 1000),然后取出my_dict.get(EMP)卸下摆臂(ID)。

否则,先删除然后打印。

2

期间迭代

my_dict={'emp_id': [100, 200, 10000]} 
new_dict={ emp:[ele for ele in ids if ele <= 1000] for emp,ids in my_dict.iteritems() } 
{'emp_id': [100, 200]} 
+0

为什么10000没有出现在所产生的'dict'中? –

+0

@ Ev.Kounis对不起,错字应该是1000 – galaxyan