在字典上映射func

时间:2013-02-14 22:09:53

标签: 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的所有正确的索引值,但我想不出更新字典的好方法。有什么想法吗?

2 个答案:

答案 0 :(得分: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)

(如果您真的想要,可以使用partiald.__setitem__进行单行播放。)

但这是一件很愚蠢的事情。首先,它意味着你正在构建一个值列表,只是为了抛弃它们。 (或者,在Python 3中,除非你编写一些遍历map迭代器的代码,否则你实际上并没有做任何。)但更重要的是,你为自己做的事情更难没有充分的理由。如果您不需要就地修改内容,请不要这样做。如果您确实需要修改内容,请使用for循环。

PS,我不是说这是一个愚蠢的问题。还有其他语言map - 就像变异函数一样,所以在C ++中做这件事并不是一件愚蠢的事情。它不是 pythonic ,如果不问,你就不会知道。

答案 1 :(得分: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是礼貌的。