Tar*_*sch 219 python dictionary map-function
鉴于{ k1: v1, k2: v2 ... }我想要{ k1: f(v1), k2: f(v2) ... }提供的字典,我传递了一个函数f.
有没有这样的内置功能?或者我必须这样做
dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()])
Run Code Online (Sandbox Code Playgroud)
理想情况下我会写
my_dictionary.map_values(f)
Run Code Online (Sandbox Code Playgroud)
要么
my_dictionary.mutate_values_with(f)
Run Code Online (Sandbox Code Playgroud)
也就是说,如果原始字典被改变或创建了副本,对我来说无关紧要.
Mar*_*ers 307
没有这样的功能; 最简单的方法是使用字典理解:
my_dictionary = {k: f(v) for k, v in my_dictionary.items()}
Run Code Online (Sandbox Code Playgroud)
在python 2.7中,使用该.iteritems()方法而不是.items()节省内存.直到python 2.7才引入dict理解语法.
请注意,列表上也没有这样的方法; 你必须使用列表理解或map()功能.
因此,您也可以使用该map()函数处理您的dict:
my_dictionary = dict(map(lambda kv: (kv[0], f(kv[1])), my_dictionary.iteritems()))
Run Code Online (Sandbox Code Playgroud)
但那不是那么可读,真的.
Jes*_*ith 27
这些工具非常适合这种简单而重复的逻辑.
http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap
得到你想要的地方.
import toolz
def f(x):
return x+1
toolz.valmap(f, my_list)
Run Code Online (Sandbox Code Playgroud)
gen*_*ens 21
您可以就地执行此操作,而不是创建新的dict,这可能适用于大型词典(如果您不需要副本).
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)
Run Code Online (Sandbox Code Playgroud)
结果my_dictionary包含:
{'a': 2, 'b': 3}
Run Code Online (Sandbox Code Playgroud)
luc*_*yan 10
由于PEP-0469将iteritems()重命名为items(),而PEP-3113删除了Tuple参数解包,因此在Python 3.x中,您应该编写Martijn Pieters吗?像这样回答:
my_dictionary = dict(map(lambda item: (item[0], f(item[1])), my_dictionary.items()))
Run Code Online (Sandbox Code Playgroud)