0
votes

Rechercher un dictionnaire pour trouver la valeur clé

J'utilise Python 2.7 et j'ai le dictionnaire suivant

x = "port-security maximum 10"

for name, val in my_dict.iteritems():
    if x in val:
        print name


2 commentaires

Dans votre exemple x = "Port-Security maximum 10" mais aucune des valeurs n'est réellement égale à ce que x a


Vous devez ajouter le mot switchport au début de x , mais le point que je fais dans ma réponse est toujours tenu.


4 Réponses :


1
votes

On dirait que si l'instruction est censée rechercher x code> dans une chaîne, mais depuis val code> est une liste, c'est vraiment la vérification de la liste dans une liste. Ajoutez une autre boucle sur val code> pour obtenir le comportement que vous voulez comme si:

x = "port-security maximum 10"

for name, val in my_dict.iteritems():
    for v in val:
        if x in v:
            print name


4 commentaires

Bien sûr que ça fait. Mais à en juger par son comportement prévu ainsi que le fait que, dans son exemple, x n'est pas dans la liste, mais est une sous-chaîne d'un élément de la liste, il est prudent de supposer que le chèque a été signifié. être fait contre chaque élément de la liste plutôt que la liste elle-même.


Cela a effectivement travaillé pour la recherche, mais la seule chose est que je devais chercher permet de dire "Port-Security Maximum", il imprimera le nom 3 fois, est là pour imprimer uniquement le nom une fois que c'est dans la liste 3 fois ?


Oui, vous pouvez ajouter un break après le nom d'impression


Vous faites un point solide. Plutôt qu'une faute de frappe, op avait autre chose à l'esprit. Solution valide à l'interprétation valide. Vote renversé.



0
votes

Utilisez ceci:

for name, val in my_dict.iteritems():
    combined = '\t'.join(val)
    if x in combined:
        print name


6 commentaires

Cela ne fera pas le problème. La question de l'OP est due à une faute de frappe. Cela rend juste la recherche plus inefficace et fournit à l'explication.


@Madphysiciste S'il voulait rechercher "Port-Security Maximum 10" dans le dictionnaire, cette solution ne fonctionne pas?


Oui. Je n'avais pas envisagé que X n'était pas une faute de frappe, étant donné que la description de la prose était incompatible. Downvote supprimé.


@Madphysicist jusqu'à présent, la personne n'a pas dit que c'est une faute de frappe. ou même même édité sa question donc je ne pense pas si c'est vraiment une faute de frappe


Il y a une forte implication de celui-ci, car la prose déclare "et je souhaite pouvoir chercher à travers les valeurs pour dire quelque chose comme ce Switchport Port-Security maximum 10 "


En outre, le commentaire de OP à ma réponse implique la même chose. Je conviens que cela n'a jamais été admis en op d'être une faute de frappe.



2
votes

Préface: Cette réponse suppose que votre intention consiste à rechercher une correspondance parfaite à votre chaîne de recherche. Cela implique que x = 'port-sécurité maximum 10' code> était une faute de frappe dans la question initiale. Si vous souhaitez rechercher une chaîne partielle, vous devrez faire une recherche linéaire comme les autres réponses suggérées (sauf si vous ne construisez pas une trie à l'avant, mais je ne veux pas y aller dans cela). Strong>

Votre problème immédiat est que x code> ne démarre pas avec le mot switchport code> comme toutes les chaînes de vos valeurs le font, donc bien sûr, il n'est pas trouvé. Votre boucle est en fait totalement parfaite. P>

S'il s'agit d'une opération que vous devez faire souvent, inverser le dictionnaire. L'ensemble du point d'un dictionnaire est d'autoriser la recherche rapide. Effectuer une recherche linéaire sur plusieurs valeurs semble très em> mauvaise utilisation de votre structure de données: p> xxx pré>

Vous pouvez simplement faire: p>

set(['GI2/1/1', 'GI2/1/3'])


1 commentaires

Merci pour cela, jamais pensé à le faire comme ça, allez essayer ça maintenant



1
votes

Je suis juste en train d'écrire une boucle pour cela.

for name, val in my_dict.items():
    v = map(lambda l: l.find(x) >= 0, val)
    if any(v):
        print (name)


4 commentaires

l.find (x)> = 0 semble gênant par rapport à x dans l .


En outre, le générateur de cartes sera épuisé par l'appel de liste dans PY 3 (tout retournera toujours faux), tandis que l'appel de la liste est inutile dans PY 2.


Je mentionne PY 3 à cause de votre syntaxe d'impression.


J'ai eu une py3 pratique. Si vous regardez la «chaîne de recherche», ce n'est pas une correspondance exacte. Donc, vous ne pouvez pas simplement faire x dans la liste . C'est la raison pour laquelle votre solution ne fonctionnera pas comme @Madphysicist. Je comprends ton point de vue!! Désolé .. Correction de la réponse.