1

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

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) 重新插入到字典中的每个相应插槽中。该函数工作正常,并打印它返回应用了函数的所有正确索引值,但我想不出更新字典的好方法。有任何想法吗?

4

2 回答 2

2

您不想map用于更新任何类型的序列;那不是它的用途。map用于生成新序列:

dict2 = dict(map(func, dict1.iteritems()))

当然func,必须采取(key, old_value)并返回(key, new_value)才能按原样工作。如果它只是返回,比如说,new_value你需要以某种方式将它包装起来。但在这一点上,你可能最好使用字典理解而不是map调用和dict构造函数:

dict2 = {key: func(value) for key, value in dict1.itervalues()}

如果你想使用map,并且你想改变,你可以通过创建一个更新事物的函数来做到这一点,如下所示:

def func_wrapped(d, key):
    d[key] = func(d[key])
map(partial(func_wrapped, d), dict1)

(如果你真的想要,这甚至可以通过使用partialwith来完成。)d.__setitem__

但这是一件愚蠢的事情。一方面,这意味着您正在构建一个值列表,只是为了将它们丢弃。(或者,在 Python 3 中,除非您编写一些迭代迭代器的代码,否则您实际上并没有做任何事情map。)但更重要的是,您无缘无故地让事情变得更加困难。如果您不需要就地修改内容,请不要这样做。如果您确实需要就地修改内容,请使用for循环。

PS,我并不是说这是一个愚蠢的问题。还有其他语言确实具有map类似的变异函数,因此在 C++ 中做这件事不会是一件愚蠢的事情。它只是不是pythonic,如果不问你就不会知道。

于 2013-02-14T22:11:55.670 回答
1

您的函数可以改变列表:

>>> 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

于 2013-02-14T22:17:33.140 回答