Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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_Dictionary_Dictionary Comprehension - Fatal编程技术网

Python 返回不包括指定键的字典副本

Python 返回不包括指定键的字典副本,python,dictionary,dictionary-comprehension,Python,Dictionary,Dictionary Comprehension,我想创建一个函数,该函数返回字典的副本,不包括列表中指定的键 考虑到这本词典: my_dict = { "keyA": 1, "keyB": 2, "keyC": 3 } 不带按键(my_dict,['keyB','keyC'])调用应返回: { "keyA": 1 } 我想用简洁的词典理解一行来做这件事,但我遇到了麻烦。我的尝试是: def without_keys(d, keys): return {k: d[f] if k not in keys

我想创建一个函数,该函数返回字典的副本,不包括列表中指定的键

考虑到这本词典:

my_dict = {
    "keyA": 1,
    "keyB": 2,
    "keyC": 3
}
不带按键(my_dict,['keyB','keyC'])调用
应返回:

{
    "keyA": 1
}
我想用简洁的词典理解一行来做这件事,但我遇到了麻烦。我的尝试是:

def without_keys(d, keys):
    return {k: d[f] if k not in keys for f in d}

这是无效的语法。我如何才能做到这一点?

如果您很接近,请尝试下面的代码片段:

>>> my_dict = {
...     "keyA": 1,
...     "keyB": 2,
...     "keyC": 3
... }
>>> invalid = {"keyA", "keyB"}
>>> def without_keys(d, keys):
...     return {x: d[x] for x in d if x not in keys}
>>> without_keys(my_dict, invalid)
{'keyC': 3}

基本上,在上述情况下,如果k不在键中,则
将在听写理解结束时进行。

这应该对您有用

def without_keys(d, keys):
    return {k: v for k, v in d.items() if k not in keys}

在你的字典理解中,你应该反复阅读你的字典(不是
k
,也不确定那是什么)。范例-

return {k:v for k,v in d.items() if k not in keys}

对于那些不喜欢列表理解的人,这是我的版本:

def without_keys(d, *keys):
     return dict(filter(lambda key_value: key_value[0] not in keys, d.items()))
用法:

>>> d={1:3, 5:7, 9:11, 13:15}
>>> without_keys(d, 1, 5, 9)
{13: 15}
>>> without_keys(d, 13)
{1: 3, 5: 7, 9: 11}
>>> without_keys(d, *[5, 7])
{1: 3, 13: 15, 9: 11}

我认为简单比复杂好,在这种情况下,Pythoic的方法是从字典中弹出不需要的项,因为过滤几乎总是需要对所有项的子集进行循环(弹出和成员资格检查的成本几乎可以忽略,因为散列)

演示:


甚至更短。显然,Python3允许您从一个dict_键中“减去”一个
列表

def不带_键(d,键):
返回{k:d[k]表示d.keys()中的k-keys}

我更喜欢这个解决方案,因为它可以节省不调用
d[x]
索引操作的(微小的)开销。这是一个浅拷贝,尽管您声明作为一个集合无效。这有什么原因吗?列表也可以吗?是的,列表也可以(您可以试试),但通常当顺序对您不重要时,
set
是首选(即使从性能方面来说,在这个只有少量数据的简短示例中,这并不重要)。这比获取所有密钥然后使用for循环手动跳过不需要的密钥快吗?我会按照相同的路径删除密钥;但它与其他提案有很大的不同:原来的格言被修改了。如果我们能接受,那就好了。否则,在删除之前,我只需从d.copy()开始。请注意,使用
keys()
而不是
items()
要慢约33%:
def without_keys(d, ex): 
    for i in ex: d.pop(i) 
    return d
In [11]: my_dict = { 
    ...:     "keyA": 1, 
    ...:     "keyB": 2, 
    ...:     "keyC": 3 
    ...: }                                                                                                                                                                                                  

In [12]:                                                                                                                                                                                                    

In [12]: def without_keys(d, ex): 
    ...:     for i in ex: d.pop(i) 
    ...:     return d 
    ...:                                                                                                                                                                                                    

In [13]: without_keys(my_dict, ['keyB', 'keyC'])                                                                                                                                                            
Out[13]: {'keyA': 1}