映射python字典中的值

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)

但那不是那么可读,真的.

  • +1:这也是我会做的.`dict(zip(a,map(f,a.values())))`略短,但我必须考虑它正在做什么,并提醒自己是的,键和值以相同的顺序迭代如果dict不改变.我根本不需要考虑dictcomp正在做什么,所以这是正确的答案. (4认同)
  • 请注意,由于 [PEP3113](https://www.python.org/dev/peps/pep-3113/)(在 python 3.x 中实现)不再支持元组参数:`lambda (k,v): ( k, f(v))` 将被重写为类似 `lambda k_v: (k_v[0], f(k_v[1]))` (3认同)
  • @chiborg:那是因为您现在使用的是键数次`my_dictionary.__getitem__` 调用,而不是一次性查找所有键值对。 (2认同)
  • 为什么参数解包被取消了?这是怎样的*改进*? (2认同)
  • 来自FP语言,Python似乎非常尴尬. (2认同)

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)

  • 你知道这是一个很酷的库,因为 z. (9认同)
  • @wordsforthewise kewl 工具z (2认同)

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)

  • 酷,你也许应该将“mapdict”重命名为“mutate_values_with”或其他名称,以便清楚地表明你重写了字典!:) (3认同)
  • `zip(d.keys(),d.values())`适用于更多版本而不是`iteritems()` (2认同)

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)