J'ai un dictionnaire de mots avec des catégories. Je veux sortir les catégories si les mots correspondent aux mots de ma liste. Voici à quoi ressemble mon code en ce moment:

dictionary = {
    "object" : 'hat',
    "animal" : 'cat',
    "human" : 'steve'
}

list_of_things = ["steve", "tom", "cat"]

for categories,things in dictionary.iteritems():
    for stuff in list_of_things:

        if stuff in things:
            print categories
        if stuff not in things:
            print "dump as usual"

Actuellement, la sortie ressemble à ceci:

dump as usual
dump as usual
dump as usual
human
dump as usual
dump as usual
dump as usual
dump as usual
animal

Mais je veux que la sortie ressemble à ceci:

human
dump as usual 
animal

Je ne veux pas que ma liste imprime tout ce qu'elle itère dans le dictionnaire. Je veux seulement qu'il imprime les termes qui correspondent. Comment pourrais-je faire ça?

1
semiflex 8 août 2016 à 18:47

4 réponses

Meilleure réponse

Tout d'abord, votre dictionnaire est mal structuré; il semble que ses clés et ses valeurs aient été échangées. En utilisant les catégories comme clés, vous ne pouvez avoir qu'un seul objet par catégorie, ce qui n'est probablement pas ce que vous voulez. Cela signifie également que vous devez lire chaque entrée du dictionnaire pour rechercher un élément, ce qui est généralement mauvais signe. La solution est simple: placez l'élément à gauche des deux-points et la catégorie à droite. Vous pouvez ensuite utiliser l'opérateur «in» pour rechercher facilement le dictionnaire.

En ce qui concerne la question que vous posez directement, vous devez d'abord parcourir la liste des choses, les comparer au dictionnaire, puis imprimer le résultat. Cela imprimera exactement une chose par article dans la liste.

dictionary = {
    'hat' : 'object',
    'cat' : 'animal',
    'steve' : 'human'
}

list_of_things = ['steve', 'tom', 'cat']

for thing in list_of_things:
    if thing in dictionary:
        print dictionary[thing]
    else:
        print "dump as usual"

Cela produit:

human
dump as usual
animal
1
Ben Arvey 8 août 2016 à 17:13

Selon la façon dont vos données réelles ressemblent à votre exemple, vous pourriez faire

category_thing= {
    "object" : 'hat',
    "animal" : 'cat',
    "human" : 'steve'
}

list_of_things = ["steve", "tom", "cat"]
thingset=set(list_of_things) # just for speedup

for category,thing in category_thing.iteritems():

        if thing in thingset:
            print category
        else:
            print "dump as usual"

Ou si votre cartographie est aussi simple que dans votre exemple, vous pouvez le faire

category_thing= {
    "object" : 'hat',
    "animal" : 'cat',
    "human" : 'steve'
}

thing_category=dict((t,c) for c,t in category_thing.items()) # reverse the dict - if you have duplicate values (things), you should not do this

list_of_things = ["steve", "tom", "cat"]

for stuff in list_of_things:
     msg=thing_category.get(stuff,"dump as usual")
     print msg
1
janbrohl 8 août 2016 à 16:07

Puisque vous ne voulez que 3 lignes en sortie, vos boucles for doivent être réorganisées.

for stuff in list_of_things:
  print_val = None
  for categories,things in dictionary.iteritems():
    if stuff in things:
      print_val=categories
  if print_val is None:
    print_val="dump as usual"
  print print_val
0
ajays20078 8 août 2016 à 16:03

Vous pouvez utiliser un booléen à l'intérieur de la boucle interne for, qui passe de False (catégorie non trouvée) à True (catégorie a été trouvée), puis imprimer uniquement le categories à la fin de la boucle for if boolean = False:

isMatchFound = False
for categories, things in dictionary.iteritems():
    isMatchFound = False
    for stuff in list_of_things:
        if stuff in things:
            isMatchFound = True
            print stuff
    if isMatchFound == False:
        print("dump as usual")
1
Frangipanes 8 août 2016 à 15:55