Answers:
没有这样的功能;最简单的方法是使用dict理解:
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 kv: (kv[0], f(kv[1])), my_dictionary.iteritems()))
但这确实不是那么可读。
dict(zip(a, map(f, a.values())))
稍微短一点,但是我必须考虑一下它在做什么,并提醒自己,如果dict不变,则键和值将以相同的顺序进行迭代。我完全不必考虑dictcomp在做什么,因此这是正确的答案。
my_dictionary.__getitem__
调用。
这些工具非常适合这种简单但重复的逻辑。
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}
mapdict
为,mutate_values_with
或用某种方式使其清楚地重写了dict!:)
zip(d.keys(), d.values())
适用于更多版本,而不是iteritems()
{k:f(v) for k,v in iter(d.items())}
由于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()))
虽然我的原始答案没有指出要点(通过尝试使用defaultdict的工厂中的Accessing key解决方案来解决此问题),但我对其进行了重新设计以提出针对当前问题的实际解决方案。
这里是:
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)
想法是将原始dict子类化以赋予其所需的功能:在所有值上“映射”一个功能。
加号的是,该字典可用于存储原始数据,就好像它是一个dict
,同时根据请求通过回调转换任何数据。
当然,可以随意使用所需的名称来命名类和函数(此答案中选择的名称受PHP array_walk()
函数的启发)。
注意:try
- except
块和return
语句都不是功能必需的,它们可以进一步模仿PHP的行为array_walk
。
__missing__
要转换的现有键调用该方法,因此无法解决OP问题,除非通过的工厂方法以某种方式将origin dict用作后备,但这不是示例用法的一部分,我认为这对眼前的问题没有令人满意的答案。
Given a dictionary { k1: v1, k2: v2 ... } ...
。也就是说,您已经有一个dict
开始
{v1: f(v1), v2: f(v2), ...}
给定的方式[v1, v2, ...]
,而不是给定一个命令的方式。我将编辑我的答案以纠正该问题。
为了避免从lambda内部进行索引,例如:
rval = dict(map(lambda kv : (kv[0], ' '.join(kv[1])), rval.iteritems()))
您也可以这样做:
rval = dict(map(lambda(k,v) : (k, ' '.join(v)), rval.iteritems()))
lambda(k,v)
无法正常工作。参见stackoverflow.com/questions/21892989/…–
刚遇到这个用例。我实现了gens的answer,添加了一种递归方法来处理也是dict的值:
def mutate_dict_in_place(f, d):
for k, v in d.iteritems():
if isinstance(v, dict):
mutate_dict_in_place(f, v)
else:
d[k] = f(v)
# Exemple handy usage
def utf8_everywhere(d):
mutate_dict_in_place((
lambda value:
value.decode('utf-8')
if isinstance(value, bytes)
else value
),
d
)
my_dict = {'a': b'byte1', 'b': {'c': b'byte2', 'd': b'byte3'}}
utf8_everywhere(my_dict)
print(my_dict)
这在处理在Python 2中将字符串编码为字节的json或yaml文件时非常有用
dict((k, f(v)) for k, v in mydict.iteritems())
,即没有方括号,这将阻止通过生成器创建中间列表。