Python:如何变异字典值的子集?
我已经创建了一本字典Python:如何变异字典值的子集?,python,dictionary,for-loop,dictionary-comprehension,Python,Dictionary,For Loop,Dictionary Comprehension,我已经创建了一本字典d。我只想更改特定类型的值。例如,我想用字符串的长度替换字符串 执行此操作的枯燥方法是使用for循环: for k,v in d.items(): if isinstance(v, str): d[k] = len(v) 但是循环不是很慢吗? 这可以通过理解来完成。我认为这相当于上述情况: d = {k: len(v) if isinstance(v, str) else v for k,v in d.items()} 我用地图试过了,但这些都不起
d
。我只想更改特定类型的值。例如,我想用字符串的长度替换字符串
执行此操作的枯燥方法是使用for循环:
for k,v in d.items():
if isinstance(v, str):
d[k] = len(v)
但是循环不是很慢吗?这可以通过理解来完成。我认为这相当于上述情况:
d = {k: len(v) if isinstance(v, str) else v for k,v in d.items()}
我用地图试过了,但这些都不起作用(显然是因为我不明白):
这似乎有效,但它越来越大,越来越难看:
dict(map(lambda kv: (kv[0], len(kv[1]) if isinstance(kv[1], str) else kv[1]), d.items()))
这种操作似乎很常见,但我找不到具体的答案。什么是正确的、通灵的、有效的方法呢?你已经有了答案,CoryKramer已经提到了
d = {k: len(v) if isinstance(v, str) else v for k,v in d.items()}
这就做到了,而且是最干净的方法。您的
dict
理解是正确的,imho是实现这一点的pythonic方法。for循环不会创建新字典,只替换那些以字符串作为值的项。理解创建一个新的字典并设置每个元素,包括那些以非字符串作为值的元素。您询问循环是否缓慢,但当您需要处理一组值中的每个项时,没有其他选择。理解不是魔法;这也是一个循环。@PaulCornelius Aww,不是魔法?不,我只是觉得它在幕后更优化。所以for
循环可能更快?或者使用更少的内存?在其他条件相同的情况下,你总是更喜欢理解而不是for循环。但是,如果字典中有一百万个条目,其中只有两个是字符串,那么理解将执行99998个不必要的副本,而for循环只会替换2个值。所以像“理解=快,for循环=慢”这样的规则太简单了。@P1h3r1e3d13在这种情况下,for循环肯定会使用更少的内存,事实上,它使用的内存量是恒定的,而“理解”需要O(n)内存。但是,即使你的循环完全等同于理解,也就是说,它将构建一个新的dict而不是修改一个现有的dict,那么你只能期望边际速度增益。主要为了可读性,应该优先考虑理解。
d = {k: len(v) if isinstance(v, str) else v for k,v in d.items()}