Python 2.7改进算法,检查字典键是否不在列表中,如果是,则删除该键

时间:2016-08-25 18:28:48

标签: python python-2.7 dictionary

我正在玩一些解决方案,但我正在寻找一种在Python中实现这一目标的最佳和最简洁的方法。基本上我有一个名为'd'的字典和一个列表'l'。如果字典包含不在列表中的值,则删除字典中的该值。所以给出:

d = {1 : "bob", 2 : "mary", 3 : "joe"}
l = [2,3]

d的第一个键被删除。

d = {2 : "mary", 3 : "joe"}
l = [2,3]

我有一个有效的解决方案但感觉不需要使用标志。

flag = False
del_vals = list()

for key in d.iterkeys():
  for i in l:
    if key == i: flag = True
  if flag == False:
    del_vals.append(key)
  flag = False

for k in del_vals: 
  d.pop(k, None)

有没有办法可以编写它来提高性能并使其更干净?是否涉及使用发电机或其他任何东西。

2 个答案:

答案 0 :(得分:4)

列表理解将从Python 2.7开始:

d = {k: v for k, v in d.iteritems() if k in l}

在Python 3中使用items()代替iteritems()

d = {k: v for k, v in d.items() if k in l}

答案 1 :(得分:0)

您也可以使用集合来实现相同的目标:

z={i:d[i] for i in set(d.keys()).intersection(l)}

或使用以下

p={i:d[i] for i in d.keys() if i in l}

或者这样做

q={i:d[i] for i in set(d.keys()) & set(l)}

或者,您也可以这样做:

for i in set(d.keys()) - set(l):
    del(d[i])