给定一个字典{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)

or

my_dictionary.mutate_values_with(f)

也就是说,对我来说,原始字典是否发生了突变或创建了一个副本都无关紧要。


当前回答

由于在Python 3中,PEP-0469将iteritems()重命名为items(), PEP-3113删除了元组参数解包。x你应该把马丁·彼得的答案写成这样:

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

其他回答

没有这样的函数;最简单的方法是使用字典理解:

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

在python 2.7中,使用.iteritems()方法代替.items()来节省内存。字典理解语法直到python 2.7才被引入。

注意,在列表上也没有这样的方法;您必须使用列表推导式或map()函数。

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

my_dictionary = dict(map(lambda kv: (kv[0], f(kv[1])), 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)

您可以在原地执行此操作,而不是创建一个新的字典,这可能更适合大型字典(如果您不需要副本)。

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}

由于在Python 3中,PEP-0469将iteritems()重命名为items(), PEP-3113删除了元组参数解包。x你应该把马丁·彼得的答案写成这样:

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

为了避免从lambda内部进行索引,例如:

rval = dict(map(lambda kv : (kv[0], ' '.join(kv[1])), rval.iteritems()))

你还可以:

rval = dict(map(lambda(k,v) : (k, ' '.join(v)), rval.iteritems()))