La comparaison de Deux Dictionnaires de Valeurs de Clé et le Retour de la Valeur Si Match
Je suis débutant en Python, mais j'ai essayé cette syntaxe et je ne peux pas le comprendre, qui a été vraiment décevant.
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
if crucial.keys() in dishes.keys():
print dishes[value]
Ce que je veux faire, c'est -- si crucial a une clé (dans ce cas, eggs
) dans les plats, il sera de retour 2
. Il semble assez simple, mais je crois que je dois être déconner un certain type de syntaxe quelque part. Si quelqu'un pouvait me guider un peu, ce serait grandement apprécié.
Les vrais dictionnaires je suis en comparant avec est d'environ 150 touches de long, mais j'espère que ce code est assez simple.
Quelle est la version de Python que vous utilisez?
OriginalL'auteur yrekkehs | 2012-12-05
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour effectuer une itération sur les touches dans l'essentiel et de les comparer les uns contre les plats clés. Donc une version modifiée de votre code.
Il pourrait être mieux, a déclaré que (pas besoin de préciser .les touches):
Vous avez raison, et une compréhension de liste est la meilleure option, cependant j'ai pensé un exemple explicite serait utile pour un débutant en Python.
Merci!!!! Cela a été incroyablement utile! Je suis en train de lire à travers la compréhension de liste dès maintenant pour en savoir un peu plus ...
Vous êtes les bienvenus! Compréhension de liste est certainement la meilleure façon de faire quelque chose comme cela, afin que vous ne pouvez pas aller mal à lire sur elle.
OriginalL'auteur timc
Si vous êtes à l'aide de Python 3, le
keys
méthode de dictionnaires suit laset
interface. Cela signifie que vous pouvez le faire à l'intersection de la clés des deux dictionnaires à l'aide de la&
opérateur.Ou si vous avez besoin d'une liste de valeurs:
En Python 2 vous gérer, la même chose en créant explicitement de jeux (peut-être à partir de la
iterkeys
générateur), mais probablement il serait préférable de simplement faire une boucle sur les touches, comme plusieurs de l'autre réponse suggèrent.Voici une variation sur la boucle que je ne pense pas que j'ai vu quelqu'un d'autre de le faire. La boucle externe obtient à la fois les clés et les valeurs de la
dishes
dict, de sorte que vous n'avez pas besoin d'séparément rechercher la valeur par clé.OriginalL'auteur Blckknght
l'aide de la liste de compréhension est bonne
ou ,comme par gnibbler:
cette expression va se répéter crucial chaque clé cruciale, si la clé dans les plats, il sera de retour la valeur de la même clé dans les plats , enfin, de revenir une liste de toutes les valeurs de match.
ou , vous pouvez utiliser de cette façon, (set (essentiel) & set(plats)) return clés communs de set, puis itérer cette série et renvoyer les valeurs dans les plats .
has_key
est obsolète. Veuillez utiliserx in dishes
au lieuOu même
[dishes[x] for x in set(crucial).intersection(dishes)]
à raser un énorme 70ns 🙂c'est cool ! ..
OriginalL'auteur Shawn Zhang
Si vous n'êtes pas déjà familier avec Python REPL (Read-Évaluer-Print-Boucle -- cette chose où vous tapez dans le code, appuyez sur entrée et il évalue immédiatement), ce serait un bon outil ici.
Donc permet de commencer à briser vers le bas de votre code.
Assez Simple. Si je remarque que vous n'avez pas toutes les valeurs de la
crucials
dictionnaire. Je ne suis pas sûr si c'est une abréviation pour vous exemple ou si vous êtes simplement seulement se soucier de la clés. Si vous êtes seulement à se soucier de les touches, alors je suppose que vous êtes à l'aide d'un dictionnaire afin d'assurer l'unicité. Dans ce cas, vous devriez vérifier leset
structure de données.Exemple:
Poursuivant nous avons
ici, vous êtes à l'aide de la
opérateur de comparaison. Exemple:
Si nous évaluons
crucial.keys()
etdishes.keys()
nous obtenonsdonc, lors de l'exécution de votre code évalue comme
qui renvoie
False
parce que la valeur['eggs', 'bacon', 'sausage']
(qui est une liste) n'est pas dans la liste['eggs', 'bacon', 'sausage', 'spam']
(en fait, il n'existe pas de listes à l'intérieur de cette liste, seules les chaînes de caractères).Donc en cours d'évaluation comme
Plutôt on dirait que vous avez mixte/confondre la
in
opérateur qui renvoie un booléen et le pour itérateur (for item in collection
). Il y a une syntaxe pour ce genre de chose. Il est appelé interprétations de la liste lequel vous pouvez trouver des échantillons de @ShawnZhang et @kmad réponses. Vous pouvez penser que c'est un laconique de filtrer et de le modifier (carte) une collection, de revenir une liste. Je ne veux pas trop en profondeur, là ou je vais finir dans une introduction à la programmation fonctionnelle.Votre autre option est d'utiliser le
for .. in
itération etin
opérateurs séparément. C'est la solution @itmc a donné. Ces solutions sont sans doute plus connu ou le plus facile pour les débutants. Il sépare clairement le comportement de l'itération et de filtrage. Il est également plus comme ce serait écrit dans d'autres langages de programmation qui n'ont pas d'équivalent aux interprétations de la liste. Ceux qui travaillent dans le Python beaucoup serait probablement favorable à la compréhension de la syntaxe.OriginalL'auteur vossad01
has_key()
a été supprimé en Python 3: http://docs.python.org/3.1/whatsnew/3.0.html#builtinsAu lieu de cela, vous pouvez utiliser:
La méthode utilisée ici est appelé compréhension de liste. Vous pouvez lire à ce sujet ici:
http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions
OriginalL'auteur kmad
De la même façon, vous pouvez avoir
set(dishes.keys()) - set(crucial.keys())
,set(dishes.keys()) | set(crucial.keys())
, ouset(dishes.keys()) ^ set(crucial.keys())
.Code seulement les réponses sont généralement pas très bon. Vous avez besoin d'ajouter une explication ta réponse.
OriginalL'auteur JoeLiu