Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除字典中不在集合中的条目_Python_Python 2.7 - Fatal编程技术网

Python 删除字典中不在集合中的条目

Python 删除字典中不在集合中的条目,python,python-2.7,Python,Python 2.7,给定以下字典和集合: d = {1 : a, 2 : b, 3 : c, 4 : d, 5 : e } s = set([1, 4]) 我想知道是否有可能删除集合中未包含的所有词典条目(即2,3,5)。 我知道,我可以通过迭代字典并检查每个键来实现这一点,但由于我是Python新手,到目前为止遇到了许多“快捷方式”,我想知道是否存在一个用于此特定问题的快捷方式 d = {1 : 'a', 2 : 'b', 3 : 'c', 4 : 'd', 5 : 'e' } s = set([1, 4])

给定以下字典和集合:

d = {1 : a, 2 : b, 3 : c, 4 : d, 5 : e }
s = set([1, 4])
我想知道是否有可能删除集合中未包含的所有词典条目(即2,3,5)。 我知道,我可以通过迭代字典并检查每个键来实现这一点,但由于我是Python新手,到目前为止遇到了许多“快捷方式”,我想知道是否存在一个用于此特定问题的快捷方式

d = {1 : 'a', 2 : 'b', 3 : 'c', 4 : 'd', 5 : 'e' }
s = set([1, 4])
由于您不应该在编辑词典时对其进行修改,因此有两种可能创建新词典

一种是从旧字典中创建一个新字典,过滤掉以下值:

d2 = dict((k,v) for k,v in d.iteritems() if k in s)
第二种方法是提取键,将它们与
s
-集相交,并使用它们构建新词典:

d2 = dict((k, d[k]) for k in set(d) & s)
第三个是直接从
d
中删除元素:

for k in set(d) - s:
    del d[k]

以下是两个不错的解决方案:

d = {1 : "a", 2 : "b", 3 : "c", 4 : "d", 5 : "e" }
keep_keys = set((1, 4))

# option 1, builds a new dictionary
d2 = {key:d[key] for key in set(d) & keep_keys}

# option 2, modifies the original dictionary
map(d.__delitem__, frozenset(d) - keep_keys)
如果速度是您想要的,您应该分析两种方法中哪一种更快。

另一种解决方案:

d = {1 : "a", 2 : "b", 3 : "c", 4 : "d", 5 : "e" }
s = set([1, 4])
r = { k:d[k] for k in ( d.viewkeys() - s ) }

如果有东西在
remove
中,而不是在
d
中,则将引发
KeyError
。呸,Python令人困惑。为什么在迭代字典时修改它是不好的?在任何语言中,在迭代字典时修改任何容器都是不好的。这是因为迭代器可能会混淆。通常,迭代器希望容器的内部状态保持现在的状态,以便能够找出“next”元素的位置。例如,当您在序列上迭代时,迭代器可能基于索引。。。如果删除下一个元素,然后盲目增加索引,则实际上跳过了一个元素,并可能最终超出范围。