给定一个字典{ k1: v1, k2: v2 ... }
,我希望在传递函数f
的情况下获得{ k1: f(v1), k2: f(v2) ... }
。
有这样的内置函数吗?或者我必须要做
dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()])
理想情况下,我只需要写
my_dictionary.map_values(f)
或
my_dictionary.mutate_values_with(f)
也就是说,对我来说,无论是原始字典发生了变化还是创建了一个副本都无关紧要。
发布于 2012-09-01 23:33:08
没有这样的函数;要做到这一点,最简单的方法是使用字典理解:
my_dictionary = {k: f(v) for k, v in my_dictionary.items()}
在Python2.7中,使用.iteritems()
方法代替.items()
来节省内存。字典理解语法直到python2.7才被引入。
请注意,列表上也没有这样的方法;您必须使用列表理解或map()
函数。
因此,您也可以使用map()
函数来处理您的字典:
my_dictionary = dict(map(lambda kv: (kv[0], f(kv[1])), my_dictionary.iteritems()))
但这并不是那么可读,真的。
发布于 2014-05-16 04:16:40
这些工具对于这种简单但重复的逻辑非常有用。
http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap
把你带到你想去的地方。
import toolz
def f(x):
return x+1
toolz.valmap(f, my_list)
发布于 2014-08-24 16:36:21
您可以就地执行此操作,而不是创建新字典,这对于大型字典可能更可取(如果您不需要副本)。
def mutate_dict(f,d):
for k, v in d.iteritems():
d[k] = f(v)
my_dictionary = {'a':1, 'b':2}
mutate_dict(lambda x: x+1, my_dictionary)
my_dictionary
中的结果包含:
{'a': 2, 'b': 3}
https://stackoverflow.com/questions/12229064
复制相似问题