72

作りたい辞書について質問があります。私の目標は、以下のように、単一の値に複数のキーを持つことです。

dictionary = {('a', 'b'): 1, ('c', 'd'): 2}
assert dictionary['a'] == 1
assert dictionary['b'] == 1

何か案は?

4

5 に答える 5

41

私はあなたがこれを意味すると思います:

class Value:
    def __init__(self, v=None):
        self.v = v

v1 = Value(1)
v2 = Value(2)

d = {'a': v1, 'b': v1, 'c': v2, 'd': v2}
d['a'].v += 1

d['b'].v == 2 # True
  • Python の文字列と数値は不変オブジェクトです。
  • したがって、変更に応じて「更新」される同じ値d['a']参照したい場合は、値が変更可能なオブジェクト (上記のようなユーザー定義クラス、または , , )を参照するようにします。d['b']dictlistset
  • 次に、 でオブジェクトを変更すると、両方とも同じオブジェクトを指しているためd['a']d['b']が同時に変更されます。
于 2012-04-12T13:42:42.170 に答える
16

このディクショナリに頻繁に追加する場合は、クラスベースのアプローチを採用することをお勧めします。 -同じ値

ただし、静的辞書があり、複数のキーで値にアクセスするだけでよい場合は、2 つの辞書を使用するという非常に単純な方法を使用できます。1 つはエイリアス キーの関連付けを格納するためのもので、もう 1 つは実際のデータを格納するためのものです。

alias = {
    'a': 'id1',
    'b': 'id1',
    'c': 'id2',
    'd': 'id2'
}

dictionary = {
    'id1': 1,
    'id2': 2
}

dictionary[alias['a']]

辞書に追加する必要がある場合は、両方の辞書を使用するために次のような関数を作成できます。

def add(key, id, value=None)
    if id in dictionary:
        if key in alias:
            # Do nothing
            pass
        else:
            alias[key] = id
    else:
        dictionary[id] = value
        alias[key] = id

add('e', 'id2')
add('f', 'id3', 3)

これは機能しますが、同様の構造を使用することもできますが、最終的には、独自のデータ構造を作成することがおそらく進むべき道だと思います。

于 2015-08-17T18:00:42.147 に答える