在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()
函数启发的)。
注意: try
– except
块和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()))