2
votes

Comment puis-je trouver quelle clé existe dans dict sans instructions if?

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 >


1 commentaires

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 faire si vous saisissez dict: return key dans une fonction appropriée.


8 Réponses :


2
votes

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.


1 commentaires

Mais il y a un if ici.



3
votes

Vous pouvez le faire avec une opération set:

set(dict).intersection(['aa', 'bbb', 'cccc', 'ddddd', 'e'])


1 commentaires

Plus concis: set (dict) .intersection ... . Soyez cependant averti de l'utilisation de dict .



0
votes

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


0 commentaires

0
votes

Pas de déclarations if? Essayez ce qui suit:

i = 0
while yourlist[i] not in yourdict: i+=1
final_key = yourlist[i]


0 commentaires

1
votes

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']
)


1 commentaires

Mais il y a un if ici.



1
votes

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


0 commentaires

0
votes

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>


1 commentaires

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 .



0
votes

Les one-liners sans instructions if ne sont pas un meilleur code.

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


0 commentaires