web-dev-qa-db-de.com

Ist es möglich, mehreren Schlüsseln in einem Diktierobjekt denselben Wert gleichzeitig zuzuweisen?

In Python brauche ich ein Wörterbuchobjekt, das wie folgt aussieht: 

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

Ich konnte dies erfolgreich erreichen, indem ich die Funktionen dict.update() und dict.fromkeys() so kombinierte:

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

Da der Code jedoch für Anfänger geschrieben wird, die gelegentlich Schlüssel/Werte hinzufügen müssen, würde ich eine einfache (Perl-ähnliche) Syntax bevorzugen, z.

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

Dies gibt mir jedoch:

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

Gibt es eine Möglichkeit, mein erstes Beispiel (mit dict.update() und dict.fromkeys()) weiter zu vereinfachen und das Diktierobjekt zu erhalten, nach dem ich suche?

Oder, alternativ, wenn ich ein Diktat mit Tupeln wie in meinem zweiten Beispiel habe, gibt es eine einfache Möglichkeit für mich, eine Suche wie myDict['c'] oder myDict.get('c') durchzuführen und den Wert 10 zu erhalten?

34
BillyBBone

Ich würde sagen, was Sie haben, ist sehr einfach, Sie könnten es leicht verbessern:

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

Wenn Ihre Schlüssel Tuple sind, können Sie Folgendes tun:

>>> 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

Dies ist natürlich der erste gefundene Wert, dessen Schlüssel das angegebene Element enthält.

41
SilentGhost

Ähnlich wie @SilentGhost, aber eine deklarativere Syntax bevorzuge ich:

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

Ihr erstes Beispiel kann mit einer Schleife vereinfacht werden:

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

Keine spezialisierte Syntax oder Trickserei, und mir fällt nichts ein, was einfacher zu verstehen wäre.

In Bezug auf Ihre zweite Frage gibt es keine einfache und effiziente Möglichkeit, die Suche wie in Ihrem zweiten Beispiel durchzuführen. Ich kann mir nur vorstellen, über die Tasten (Tupel) zu iterieren und zu prüfen, ob sich der Schlüssel in einer von ihnen befindet, was Sie nicht suchen. Halten Sie sich an die Verwendung eines einfachen Diktats mit den gewünschten Tasten.

Wenn Sie Code anstreben, der für Neulinge verständlich ist, sollten Sie sich grundsätzlich an die Grundlagen wie if-Bedingungen und for/while-Schleifen halten.

6
taleinat

Warum nicht von Diktieren erben?

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}

aber ich bevorzuge schleifenlösung 

5
remosu

Methode:

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

Verwendungszweck:

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

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

Es gibt einen Weg, der mir in den Sinn kommt .. Die Beschränkung, nur den gleichen Inhalt zu haben.

Der Wert eines Schlüssels kann keinen anderen ändern.

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

für Schlüssel in 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