web-dev-qa-db-ja.com

同じ値をdictオブジェクトの複数のキーに一度に割り当てることは可能ですか?

Pythonでは、次のような辞書オブジェクトが必要です。

_{'a': 10, 'b': 20, 'c': 10, 'd': 10, 'e': 20}
_

dict.update()関数とdict.fromkeys()関数を次のように組み合わせることで、これを正常に取得できました。

_myDict = {}
myDict.update(dict.fromkeys(['a', 'b', 'c'], 10))
myDict.update(dict.fromkeys(['b', 'e'], 20))
_

ただし、コードは時々キー/値を追加する必要がある初心者ユーザー向けに記述されているため、次のような単純なベアボーン(Perlのような)構文を好むでしょう。

_myDict = {}
myDict['a', 'c', 'd'] = 10
myDict['b', 'e'] = 20
_

しかし、これは私に与えます:

_myDict = {('a', 'c', 'd'): 10, ('b', 'e'): 20}
_

最初の例を簡単に(dict.update()およびdict.fromkeys()を使用して)簡略化し、探しているdictオブジェクトを取得する方法はありますか?

または、2番目の例のようにタプルを含む辞書がある場合、_myDict['c']_またはmyDict.get('c')などのルックアップを実行して値10を取得する簡単な方法はありますか?

41
BillyBBone

私があなたが持っているものは非常にシンプルだと言うでしょう、あなたはそれを少し改善することができます:

my_dict = dict.fromkeys(['a', 'b', 'c'], 10)
my_dict.update(dict.fromkeys(['b', 'e'], 20))

キーがタプルの場合、次のことができます。

>>> my_dict = {('a', 'c', 'd'): 10, ('b', 'e'): 20}
>>> next(v for k, v in my_dict.items() if 'c' in k)      # use .iteritems() python-2.x
10

もちろん、これは最初に見つかった値を返します。キーには特定の要素が含まれます。

46
SilentGhost

@SilentGhostに似ていますが、より宣言的な構文を好みます:

myDict = {
  **dict.fromkeys(['a', 'b', 'c'], 10), 
  **dict.fromkeys(['b', 'e'], 20)
}
14
shao.lo

最初の例は、ループを使用して単純化できます。

myDict = {}
for key in ['a', 'c', 'd']:
    myDict[key] = 10
for key in ['b', 'e']:
    myDict[key] = 20

特別な構文やトリックはありません。理解しやすいものは考えられません。

2番目の質問に関しては、2番目の例のようにルックアップを行うための簡単で効率的な方法はありません。キー(タプル)を反復処理し、キーがそれらのいずれかに含まれているかどうかを確認することしか考えられませんが、これは探しているものではありません。必要なキーで簡単な辞書を使用することに固執します。

一般に、初心者が理解できるコードを目指している場合は、if条件やfor/whileループなどの基本を守ります。

7
taleinat

なぜdictから継承しないのですか?

class LazyDict(dict):
    def keylist(self, keys, value):
        for key in keys:
            self[key] = value

>>> d = LazyDict()
>>> d.keylist(('a', 'b', 'c'), 10)
>>> d
{'a': 10, 'c': 10, 'b': 10}

しかし、私はループソリューションを好む

6
remosu

方法:

def multi_key_dict_get(d, k):
    for keys, v in d.items():
        if k in keys:
            return v
    return None

使用法:

my_dict = {
   ('a', 'b', 'c'): 10,
   ('p', 'q', 'r'): 50
}

value = multi_key_dict_get(my_dict, 'a')
1
Shameem

思い浮かぶ1つの方法があります。同じコンテンツのみを持つという制限があります。

あるキーの値が別のキーを変更することはできません。

key_map = {   
    'KEY_UP':move_up,
    'w':'KEY_UP',
}

key_mapのキーの場合:

# loop over the `dict`

if key_map[key] in key_map:
    # one key is the value of the other

    target_key = key_map[key]
    key_map[key] = key_map[target_key]
    # overwrite key white the ontents of the other
0
tinker pony