Python 字典上的映射函数

Python 字典上的映射函数,python,Python,如何将函数映射到字典中的某些值,并更新字典中的这些值 dic1 = { 1 : [1, 2, 3, 4], 2 : [2, 3, 5, 5], 3 : [6, 3, 7, 2] ... } map(func, (data[col] for data in dic1.itervalues())) 这是我正在寻找的,但是我需要一种方法将新的func(val)重新插入到dict中的每个插槽中。该函数工作正常,并在应用func的情况下返回所有正确的索引值,但我想不出更新字典的好方法。有什么想法吗?你不

如何将函数映射到字典中的某些值,并更新字典中的这些值

dic1 = { 1 : [1, 2, 3, 4], 2 : [2, 3, 5, 5], 3 : [6, 3, 7, 2] ... }
map(func, (data[col] for data in dic1.itervalues()))

这是我正在寻找的,但是我需要一种方法将新的func(val)重新插入到dict中的每个插槽中。该函数工作正常,并在应用func的情况下返回所有正确的索引值,但我想不出更新字典的好方法。有什么想法吗?

你不想用
map
来更新任何类型的序列;这不是它的目的<代码>映射用于生成新序列:

dict2 = dict(map(func, dict1.iteritems()))
当然
func
必须获取
(键,旧值)
并返回
(键,新值)
,才能按原样工作。如果它只是返回,比如说,
new\u value
,您需要以某种方式对其进行包装。但在这一点上,与调用
map
dict
构造函数相比,理解词典可能会更好:

dict2 = {key: func(value) for key, value in dict1.itervalues()}
如果您想使用
映射
,并且您想进行变异,您可以通过创建一个更新内容的函数来实现,如下所示:

def func_wrapped(d, key):
    d[key] = func(d[key])
map(partial(func_wrapped, d), dict1)
(这甚至可以通过使用
partial
d作为一个一行程序来完成

但那是一件愚蠢的事。首先,这意味着你正在建立一个价值清单,只是为了把它们扔掉。(或者,在Python3中,除非您编写一些代码在
map
iterator上进行迭代,否则您实际上什么都没有做。)但更重要的是,您毫无理由地让事情变得更加困难。如果您不需要在适当的位置修改内容,请不要这样做。如果确实需要在适当的位置修改内容,请使用
for
循环


PS,我不是说这是一个愚蠢的问题。还有其他语言,有<代码> map < /C> >类似于函数的突变,所以在C++中做这件事不会是愚蠢的事情。它不是pythonic,如果不询问,您不会知道这一点。

您的函数可以改变列表:

>>> d = {1:[1],2:[2],3:[3]}
>>> def func(lst):
...     lst.append(lst[0])
...     return lst
... 
>>> x = map(func,d.values())
>>> x
[[1, 1], [2, 2], [3, 3]]
>>> d
{1: [1, 1], 2: [2, 2], 3: [3, 3]}

但是,请注意,这并不是惯用的python,应该只考虑用于教学/教育目的。。。通常,如果一个函数改变了它的参数,礼貌的做法是让它返回
None

啊,我明白了。那么,没有真正好的方法可以做到这一点。我无法重新创建字典,因为它映射到一个列表列表。如果他想拿回钥匙,他可能需要
iteritems
。@聪明:正如我的编辑所示,有一种方法可以做到这一点,但这不是一种好方法,因为这不是一件好事。这就像问“我如何使用
enumerate
而不是
zip
将两个列表压缩在一起?”你可以这样做,但你不应该这样做。感谢帮助,我刚刚将方法更改为
获取dic1.iteritems()中的键和数据:dic1[key][col]=func(data[col)
@cleer:完美的解决方案。真的吗?这很有趣。所以pythonic实践类似于
def normalize(old):old=(old-minimum)/(maximum-minimum)return None
?而不是简单地返回old?@cleer--No。在这种情况下,您实际上不会对argument@Clever:有点,但不能对整数进行变异(或者可能存在任何类型的
old
);执行
old=…
只需将本地名称
old
重新绑定一个新值,保持旧值不变。顺便说一句,+1用于指出“return
None
if you mutate”成语。@cleer:通过引用传递值的两个常用技巧因此,您可以在函数(C++风格)中更改它,即传递一个包含值的单元素列表,或传递一个包含值作为属性的类的实例。但是,更常见的是,这个问题的答案是“您可能不想这样做”。您应该考虑是否真的需要对字典进行适当的修改。Python在许多情况下使序列变换比修改序列更容易的部分原因是让您首先考虑是否真的需要对其进行修改。(当然,有时您确实需要这样做,或者至少非变异代码更难编写、更慢,等等——这就是为什么Python只会让它变得更难,而不是不可能的原因。)