J'ai un dictionnaire et je sais qu'une seule des N clés existe dans ce dictionnaire. La tâche est de trouver et d'enregistrer la valeur de la clé existante.
J'ai écrit le code bruteforce suivant mais je pense qu'il devrait y avoir un joli oneliner ou quelque chose:
final_key = None
for key in ['aa', 'bbb', 'cccc', 'ddddd', 'e']:
if key in dict:
final_key = key
break
p >
8 Réponses :
Vous pouvez essayer quelque chose comme:
next(x in your_list if x in dict)
Il génère un itérateur et ne trouvera que le premier élément de celui-ci.
Mais il y a un if ici.
Vous pouvez le faire avec une opération set:
set(dict).intersection(['aa', 'bbb', 'cccc', 'ddddd', 'e'])
Plus concis: set (dict) .intersection ... . Soyez cependant averti de l'utilisation de dict .
Vous pouvez également utiliser le filter avec la méthode get , pour trouver la clé du dictionnaire:
final_key = list(filter(lambda key: not dict.get(key,None) is None, ['aa', 'bbb', 'cccc', 'ddddd', 'e']))[0]
Remarque: Vous ne devez pas utiliser dict comme nom de variable, car il s'agit d'un mot-clé Python réservé.
Pas de déclarations if? Essayez ce qui suit:
i = 0 while yourlist[i] not in yourdict: i+=1 final_key = yourlist[i]
Cet extrait de code parcourt les clés du dictionnaire et renvoie la clé incluse dans la liste donnée.
next( x for x in dictionary.keys() if x in ['aa', 'bbb', 'cccc', 'ddddd', 'e'] )
Mais il y a un if ici.
Juste pour compléter la réponse, ce n'est en aucun cas une bonne méthode.
try:
dict[key]
except KeyError:
print("Key doesn't exist")
juste simple en python3
dict.has_key('your key here')
et en python2
dict.__contains__('your key here')
cela vous donnera la valeur True ou False
p>
Vous aurez toujours besoin d'un if et d'une boucle pour les utiliser. Ce n'est pas vraiment différent de l'instruction key in dict .
Considérez une fonction propre, documentée et traditionnelle:
next(set(candidates).intersection(set(collection))
Ou certains (non testés) one-liner tels que:
def find_first(candidates, collection):
"""Find the first element of candidates also in collection"""
for k in candidates:
if k in collection: return k
return None # or raise a KeyNotFound exception!
Quel code préféreriez-vous déboguer dans un an? Que préférez-vous optimiser s'il était trop lent (le one-liner est censé être plusieurs fois plus lent).
Pourquoi aucune instruction
if? Faites-en simplement une fonction nommée, pas besoin de tout faire d'une seule doublure (ce qui sera probablement au détriment de l'efficacité). Je préférerais un code aussi simple (ce sera même plus simple, comme vous pouvez le fairesi vous saisissez dict: return keydans une fonction appropriée.