Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 3.x_Performance_Dictionary_Key - Fatal编程技术网

Python 创建字典副本而不使用特定(子)键的最快方法是什么?

Python 创建字典副本而不使用特定(子)键的最快方法是什么?,python,python-3.x,performance,dictionary,key,Python,Python 3.x,Performance,Dictionary,Key,我需要知道在没有特定密钥的情况下获取词典副本的最快方法 我有这样一句话: users = { 1: {'state': 'apple', 'menu_id': 123, 'args':['some data']}, 2: {'state': 'something', 'menu_id': 321}, 3: {'state': 'banana', 'menu_id': 666, 'args':['trash', 'temporary']} } 我需要获得一份没有“args

我需要知道在没有特定密钥的情况下获取词典副本的最快方法

我有这样一句话:

users = {
    1: {'state': 'apple', 'menu_id': 123, 'args':['some data']},
    2: {'state': 'something', 'menu_id': 321},
    3: {'state': 'banana', 'menu_id': 666, 'args':['trash', 'temporary']}
}
我需要获得一份没有“args”键的用户副本 我用三种方法解决了这个问题,有三种解决方案:

解决方案1:

解决方案2:

解决方案3:


哪种解决方案更快,或者有其他更快的方法来获得预期的结果?

首先,我不会在任何地方使用s2。因为它很难阅读。Python代码应该是可读的

说到s1和s,它们有点不同。复制函数使用与原始对象值相同的对象引用。所以,在应用解决方案s之后,如果您在用户的字典中进行更改,您将在s中看到您的更改。但是如果您使用s1,因为新对象已创建,所以s1中不会发生更改

第一种方法甚至不可行——它对原始数据具有破坏性。您正在制作副本,而不是deepcopy,这意味着对于obj.items:v.pop'args中的k,v,没有人会改变原始结构中的子目录。 在我看来,第二种方法在语义上是错误的——您不是在没有特定键的情况下创建,而是在特定键的基础上创建新的。这完全不同,这不是技术问题,这是业务逻辑的问题。 第三种方法是唯一一种与您试图实现的目标相匹配的方法,在python中这是一种非常惯用的方法。 即使性能不应该困扰您,直到您面临性能问题,但无论如何,将第三个作为基础:

破坏性的方法是最快的 使用deepcopy的第一次进近比第三次进近慢 第二个比第三个快约2倍
s = users.copy()
for k,v in s.items(): 
    v.pop('args', None)
s = {k: {'state': v['state'], 'menu_id':v['menu_id']} for k,v in users.items()}
s = {k: {p: q for p,q in v.items() if p != 'args'} for k, v in users.items()}