7
votes

Dict a la clé de la liste

Comment puis-je déterminer si l'un des éléments de la liste est une clé d'un dict? La voie directe est,

for i in myList:
   if i in myDict:
      return True
return False


1 commentaires

@Dario: Cela pourrait être BOO, mais je suppose que les réponses seront les mêmes de toute façon.


5 Réponses :


20
votes
#!python
any(x in MyDict for x in MyList)
set(MyList).intersection(MyDict)

2 commentaires

+1 Pour plus de clarté, efficacité (de la première version seulement!), Et la simplicité.


BTW, la version «Set 'est plus rapide que la version« Toute »si la clé de myDICT' n'est pas au début de myList` Stackoverflow.com/Questtions/1737778/dict-has -key-from-list/...



2
votes

En supposant que vous parlez de Python, une autre méthode de faire cela serait:

return len([x for x in myList if x in myDict]) > 0


1 commentaires

Deux problèmes: cela construit inutilement une liste et recherche toutes les occurrences sans court-circuit.



6
votes

En plus de tout (élément de my_dict pour l'élément dans my_list) code> de @ Ronny's Réponse :

$ python main.py --maxn 65536 --npoints 16


11 commentaires

L'avantage clé de tout est que cela court-circuits et tout (carte (... perd cet avantage clé!


Brillant. Je ne sais pas très bien Python et j'ai beaucoup appris aujourd'hui en lisant toute la réponse. Votre résumé est génial. Vous devriez être attribué avec la réponse! :-)


OH MON DIEU. Je vais revenir en arrière et tester demain soir.


@ALEX: Tu as raison. J'ai précisé que la variante "carte" convient à Python 3.x


@MGAG: méfiez-vous que les micro-repères n'aiment pas beaucoup. Mesurez toujours la performance de votre code avant appliquer des optimisations.


Si cela aide, la liste a toujours entre 1 et 4 éléments et les dict ont ~ 100-150 éléments.


J'ai besoin de travailler avec Python 2.5+. La vitesse est un problème pour le client de mon code - mais à travers d'autres optimisations que je suis dans le bien maintenant. Mais je reviendrai sur le résultat causé par Alex - J'ai peut-être abandonné mon approche trop tôt et non retourné et testé pendant que je faisais d'autres optimisations ...


J'ai testé entre les deux, spécifiquement, Len ([x pour x dans NODELIST si x dans REMOFODE])> 0 vs def MGAG_LOOOOOOOOOOOOOOOOOOOOOOOOOOOOP (myDICT, MyList): Pour I dans MyList: Si j'étais dans MyDICT: retournez vrai retour false et les résultats sont presque identiques pour trois points (~ 80Sec pour chaque course), dans les 1%. La deuxième option était toujours plus rapide, mais la marge est petite.


Je viens de remarquer que la version définie n'est pas équivalente à la mienne


@Ronny pourriez-vous élaborer? Parlez-vous de ronny_set () ? C'est la même chose que le vôtre au moment de la réponse.


En effet, j'ai complètement oublié et j'ai manqué l'histoire



1
votes

C'était une réponse populaire à une question connexe: xxx pré>

Vous pouvez l'adapter pour vérifier s'il apparaît dans le dictionnaire: p>

>>> if any(k in myDict for k in myList):
...     print "Found one!"
...
Found one!


0 commentaires

1
votes

Merci beaucoup. J'ai testé la performance de toutes les réponses et le plus rapide était xxx

mais je n'ai pas essayé la réponse "SET", car je ne voyais pas comment le transformer en une ligne.


3 commentaires

L'optimisation prématurée est la racine de tout Mal. La solution () était beaucoup plus élégante.


FYI, vous voudrez utiliser la coche pour indiquer votre réponse acceptée plutôt que de poster une autre réponse comme celle-ci.


Je ne vois pas comment len () peut être plus rapide. Quelle entrée avez-vous utilisée? J'ai mesuré la performance pour toutes les réponses: