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)をdictのそれぞれのスロットに再挿入する方法が必要です。関数は正常に動作し、関数を適用してすべての適切なインデックス値を返しますが、辞書を更新するための良い方法を考えることはできません。何か案は?

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)

(これは、本当に必要な場合はpartial、withを使用してワンライナーとして実行することもできます。)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 に答える