在Python字典中的值映射

给定一个字典{ k1: v1, k2: v2 ... }我想要得到{ k1: f(v1), k2: f(v2) ... }假设我传递了一个函数f

有没有这样的内置函数? 或者我必须这样做

 dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()]) 

理想情况下,我会写

 my_dictionary.map_values(f) 

要么

 my_dictionary.mutate_values_with(f) 

也就是说,如果原始字典发生了变异或创build了一个副本,那对我来说并不重要。

没有这样的function; 最简单的方法是使用词典理解:

 my_dictionary = {k: f(v) for k, v in my_dictionary.items()} 

在Python 2.7中,使用.iteritems()方法而不是.items()来保存内存。 dict理解语法直到python 2.7才被引入。

请注意,列表中也没有这样的方法。 你必须使用列表理解或map()函数。

因此,您也可以使用map()函数来处理您的字典:

 my_dictionary = dict(map(lambda (k,v): (k, f(v)), my_dictionary.iteritems())) 

但这不是那么可读,真的。

这些工具对于这种简单而重复的逻辑非常有用。

http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap

让你正确的地方,你想成为。

 import toolz def f(x): return x+1 toolz.valmap(f, my_list) 

你可以做到这一点,而不是创build一个新的字典,这可能是大字典(如果你不需要副本)可取的。

 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} 

虽然我原来的答案错过了(通过解决这个问题的解决scheme, 在defaultdict的工厂访问密钥 ),我已经改写它提出一个实际的解决scheme,目前的问题。

这里是:

 class walkableDict(dict): def walk(self, callback): try: for key in self: self[key] = callback(self[key]) except TypeError: return False return True 

用法:

 >>> d = walkableDict({ k1: v1, k2: v2 ... }) >>> d.walk(f) 

这个想法是将原始字典的子类赋予它所需的function:“映射”所有值的函数。

优点是,这个字典可以用来存储原始数据,就像它是一个dict ,而在callback请求中转换任何数据。

当然,随意按照你想要的方式命名类和函数(在这个答案中select的名字是受PHP的array_walk()函数启发的)。

注意: tryexcept块和return语句都不是function强制的,它们在那里进一步模仿PHP的array_walk行为。

由于PEP-0469将iteritems()重命名为items()和PEP-3113 ,所以在Python 3.x中删除了Tuple参数解包 ,所以你应该写Martijn Pieters♦这样回答 :

 my_dictionary = dict(map(lambda item: (item[0], f(item[1]), my_dictionary.items()))