【问题标题】:Iteration of dict with key and List of values in python在python中使用键和值列表迭代dict
【发布时间】:2018-01-14 22:49:33
【问题描述】:

我在 python 中有字典,键为“字符串”,值为整数列表。用键和值迭代dict,如果不满足某些条件,则删除列表中的值。 迭代不正确。

例如,

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)。不确定可能是什么问题。 是否由于删除了字典中的值。

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

【问题讨论】:

  • 问题是你正在改变列表。
  • 另外,没有理由在内部循环中调用mydict.get;您已经拥有对该列表的引用,ids
  • 另外,循环末尾的continue 不是必需的。
  • 既然可以写if id <= 1000:,为什么还要写if not id > 1000:?让头痛持续下去?

标签: python python-2.7 dictionary for-loop


【解决方案1】:

您无法可靠地修改您正在迭代的列表。只需过滤列表,然后将其替换为过滤后的副本。

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()}

【讨论】:

    【解决方案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]}
    

    【讨论】:

    • 为什么 10000 没有出现在结果 dict 中?
    【解决方案3】:

    在迭代过程中修改my_dict不好。

    如果您只想打印:not (id > 1000),则删除 my_dict.get(emp).remove(id)。

    否则,请先删除再打印。

    【讨论】:

      最近更新 更多