简体   繁体   中英

Print dictionary values with list DB using Python

I have a dictionary of values like this:

indicator_keys = {
                  'i2': 'bla bla',
                  'i4': 'bla bla bla',
                  'i5': 'bla bla bla bla',
                  'i6': 'bla bla bla bla bla'
}

and I have a list like this:

a = ['i2','i4','i5','i6','i15']
b = ['i6','i3','i10','i6','i15']

I want to run a loop that will go through the dictionary and match if the item from my list matches one of the key to print the proper value but every loop I try even if there is only 1 match will prints the same sentence as the length of the WHOLE list (for example if only i2 matched he will print the value 5 times because of the For loop) this is my code so far:

for index, key in enumerate(indicator_keys):
    for i in a:
        if str(i) in indicator_keys:
            print(indicator_keys[str(i)])
    for s in b:
        if str(s) in indicator_keys:
            print(indicator_keys[str(s)])

Try this will work

for d in indicator_keys:
   if d in a or d in b:
      print(d, indicator_keys[d])

You don't need the inner for loops when you're also using the in operator. Adding an additional print might help figure out what is happening. Your code is actually iterating a and b and printing the corresponding values from the dict for every element of a and b . And it does it as many times as the number of keys in the dict .

In [1]: indicator_keys = {'i2': 'bla bla',
   ...:                   'i4': 'bla bla bla',
   ...:                   'i5': 'bla bla bla bla',
   ...:                   'i6': 'bla bla bla bla bla'}

In [2]: a = ['i2','i4','i5','i6','i15']
   ...: b = ['i6','i3','i10','i6','i15']

In [3]: for index, key in enumerate(indicator_keys):
   ...:     print("--- key: {} ---".format(key))
   ...:     for i in a:
   ...:         if i in indicator_keys:
   ...:             print(i, indicator_keys[i])
   ...:     for s in b:
   ...:         if s in indicator_keys:
   ...:             print(s, indicator_keys[s])
   ...:
--- key: i2 ---
i2 bla bla
i4 bla bla bla
i5 bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
--- key: i4 ---
i2 bla bla
i4 bla bla bla
i5 bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
--- key: i5 ---
i2 bla bla
i4 bla bla bla
i5 bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
--- key: i6 ---
i2 bla bla
i4 bla bla bla
i5 bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla
i6 bla bla bla bla bla

Getting rid of the inner for loops should make it work as expected:

In [4]: for key in indicator_keys:
   ...:     if key in a or key in b:
   ...:         print(key, indicator_keys[key])
   ...:
i2 bla bla
i4 bla bla bla
i5 bla bla bla bla
i6 bla bla bla bla bla

If you have a lot of elements in a and b , it might make sense to convert them to set .

simplified with list comprehension:

keys = [item for item in indicator_keys if (item in a) or (item in b)]
print(keys)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM