302

与えられた辞書{ k1: v1, k2: v2 ... }があれば{ k1: f(v1), k2: f(v2) ... }、関数を渡しますf

そのような組み込み関数はありますか?または私はしなければなりませんか

dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()])

理想的には私はただ書くでしょう

my_dictionary.map_values(f)

また

my_dictionary.mutate_values_with(f)

つまり、元の辞書が変更されているか、コピーが作成されているかは関係ありません。

4

8 に答える 8

447

そのような機能はありません。これを行う最も簡単な方法は、dict内包表記を使用することです。

my_dictionary = {k: f(v) for k, v in my_dictionary.items()}

Python 2.7では、メモリを節約.iteritems()する代わりにメソッドを使用します。.items()dict理解構文は、Python2.7まで導入されませんでした。

リストにもそのような方法がないことに注意してください。リスト内包表記またはmap()関数を使用する必要があります。

そのため、このmap()関数を使用してdictを処理することもできます。

my_dictionary = dict(map(lambda kv: (kv[0], f(kv[1])), my_dictionary.iteritems()))

しかし、それは実際にはそれほど読みやすいものではありません。

于 2012-09-01T15:33:08.040 に答える
36

これらのツールは、この種の単純でありながら反復的なロジックに最適です。

http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap

あなたがなりたい場所にあなたを正しくします。

import toolz
def f(x):
  return x+1

toolz.valmap(f, my_list)
于 2014-05-15T20:16:39.583 に答える
25

新しい辞書を作成するのではなく、インプレースでこれを行うことができます。これは、大きな辞書に適している場合があります(コピーが必要ない場合)。

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}
于 2014-08-24T08:36:20.557 に答える
21

iteritems()の名前をitems()に変更したPEP-0469と、タプルパラメーターのアンパックを削除したPEP-3113により、Python 3.xでは、MartijnPieters♦の回答を次のように記述する必要があります。

my_dictionary = dict(map(lambda item: (item[0], f(item[1])), my_dictionary.items()))
于 2016-09-22T13:36:10.537 に答える
4

私の元の答えは( defaultdictのファクトリでキーにアクセスするためのソリューションでこの問題を解決しようとすることによって)ポイントを逃しましたが、現在の質問に対する実際のソリューションを提案するためにそれを作り直しました。

ここにあります:

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

于 2015-05-07T12:22:47.613 に答える
2

ラムダ内からのインデックス作成を回避するには、次のようにします。

rval = dict(map(lambda kv : (kv[0], ' '.join(kv[1])), rval.iteritems()))

次のこともできます。

rval = dict(map(lambda(k,v) : (k, ' '.join(v)), rval.iteritems()))
于 2019-03-29T09:12:30.903 に答える
0

このユースケースに出くわしたばかりです。私はgensの答えを実装し、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)

これは、Python2で文字列をバイトとしてエンコードするjsonまたはyamlファイルを処理するときに役立ちます。

于 2018-04-06T08:40:10.897 に答える
0
  • 辞書にマッピングする私の方法
def f(x): return x+2
bill = {"Alice": 20, "Bob": 10}
d = {map(lambda x: f(x),bill.values())}
print('d: ',dict(d))

結果

: d:  {22: 12}
  • ディクショナリ内の反復可能な値にマップします
bills = {"Alice": [20, 15, 30], "Bob": [10, 35]}
d= {map(lambda v: sum(v),bills.values())}
g= dict(map(lambda v: (v[0],sum(v[1])),bills.items()))
# prints
print('d: ',dict(d))
print('g: ',g)

結果

d:  {65: 45}
g:  {'Alice': 65, 'Bob': 45}
于 2021-12-20T10:16:42.877 に答える