Reputation: 1
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)])
Upvotes: 0
Views: 61
Reputation: 2117
simplified with list comprehension:
keys = [item for item in indicator_keys if (item in a) or (item in b)]
print(keys)
Upvotes: 1
Reputation: 2407
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
.
Upvotes: 1
Reputation: 11
Try this will work
for d in indicator_keys:
if d in a or d in b:
print(d, indicator_keys[d])
Upvotes: 1