我正在玩一些解决方案,但我正在寻找一种在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)
有没有办法可以编写它来提高性能并使其更干净?是否涉及使用发电机或其他任何东西。
答案 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])