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

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