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()}