web-dev-qa-db-fra.com

Est-il possible d'attribuer la même valeur à plusieurs clés d'un objet dict à la fois?

En Python, j'ai besoin d'un objet dictionnaire qui ressemble à ceci: 

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

J'ai réussi à obtenir cela en combinant les fonctions dict.update() et dict.fromkeys() comme suit:

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

Cependant, étant donné que le code est écrit pour les utilisateurs novices qui peuvent avoir besoin d'ajouter occasionnellement des clés/valeurs, je préférerais une syntaxe simple, telle que les principes de base de Perl, telle que:

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

Ceci, cependant, me donne:

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

Est-il possible de simplifier davantage mon premier exemple (en utilisant dict.update() et dict.fromkeys()) et d'obtenir l'objet dicté que je cherche?

Ou bien, si j'ai un dict avec des tuples comme dans mon deuxième exemple, est-ce qu'il y a un moyen facile pour moi de faire une recherche telle que myDict['c'] ou myDict.get('c') et d'obtenir la valeur 10?

34
BillyBBone

Je dirais que ce que vous avez est très simple, vous pouvez légèrement l’améliorer pour être:

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

Si vos clés sont Tuple, vous pouvez faire:

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

Ceci, bien sûr, renverra la première valeur rencontrée, clé pour laquelle contient l'élément donné.

41
SilentGhost

Similaire à @SilentGhost mais à une syntaxe plus déclarative, je préfère:

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

Votre premier exemple peut être simplifié à l'aide d'une boucle:

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

Pas de syntaxe spécialisée ni de ruse, et je ne vois rien de plus facile à comprendre.

En ce qui concerne votre deuxième question, il n’existe pas de méthode simple et efficace pour effectuer la recherche, comme dans votre deuxième exemple. Je ne peux que penser à parcourir les clés (tuples) et à vérifier si la clé est dans l'une d'elles, ce qui n'est pas ce que vous recherchez. Tenez-vous en à un dict directement avec les touches que vous voulez.

En général, si vous recherchez un code qui peut être compris par les novices, respectez les bases telles que les conditions if et les boucles for/while.

6
taleinat

Pourquoi ne pas hériter du 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}

mais je préfère la solution de boucle 

5
remosu

Méthode:

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

Usage:

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

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

Il y a une façon qui me vient à l’esprit …….

La valeur d'une clé ne peut en changer une autre.

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

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