willpower2727
willpower2727

Reputation: 789

iterate over a subset of dictionary keys

I am looking to learn how to pass certain keys/values in a dictionary to another function within a for loop. The "certain" keys all share the same initial string and are incremented by a trailing integer like this:

data = {}
data["HMD1"] = [a,b,c]
data["HMD2"] = [d,f,g] #and so on...

There are other keys with dissimilar names witin the same dictionary. Now within a for loop I would like to pass the values for each key that starts with "HMD" to another function. Here is a minimal working example of a failed attempt:

data = {}
data["HMD1"] = [0,2,3]
data["HMD2"] = [5,6,4]
data["not"] = 1237659398
data["HMD3"] = [1,1,1]

def dummyfun(vargin):
    print(vargin)
    return vargin

for f in range(1,2,1):
    out = dummyfun(data[eval(''.join(("HMD",str(f))))])

This was a poor guess, of course it returns an error because eval() tries to evaluate "HMD1" which is not a variable but a key in data. Does anyone know how to do this properly?

Upvotes: 0

Views: 3379

Answers (2)

Copperfield
Copperfield

Reputation: 8510

You don't need eval at all for this. You only need to build the string with .format for example

for f in range(1,4): #range don't include the end point
    out = dummyfun(data["HMD{}".format(f)])

with this you get the desire result. But that will fail if the key is not in the dict, you can check it first, catch the exception or provide a default value in case the desire key is not there

#check first
for f in range(1,4): 
    key = "HMD{}".format(f)
    if key in data:
        out = dummyfun(data[key])

#catch the exception 
for f in range(1,4): 
    try: 
        out = dummyfun(data["HMD{}".format(f)])
    except KeyError:
        print("key",f,"is not in the data")

#provide a default value
for f in range(1,4): 
    out = dummyfun(data.get("HMD{}".format(f),None))

Upvotes: 1

R Nar
R Nar

Reputation: 5515

Just iterate through the dictionary using a for loop and use an if statement to check for validity of the keys:

for key in yourDict: #a for loop for dict iterates through its keys
    if 'HMD' in key: #or you can replace with any other conditional
        #DO WHAT YOU WANT TO DO HERE

And here's a quick working example:

>>> data = {'HMD1': [1,2,3], 'HMD23':'heyo mayo', 'HMNOT2':'if this prints, I did something wrong'}
>>> for key in data:
...     if 'HMD' in key:
...             print data[key]
...
[1, 2, 3]
heyo mayo

With further understand of what you want, you can also look at this backwards and create key strings and print the values that those key's point to:

#let's say you want to print HMD1, HMD2, HMD4, but not anything else
keylist = [#list of keys that you want]
for key in keylist:
    if key in data:
        print data[key]

and, again, a working example.

>>> data = {'HMD1': [1,2,3], 'HMD3':'heyo mayo, this shouldnt print', 'HMD4':123, 'HMD2':['g', 'h', 'i'], 'HMNOT2':'if this prints, I did something wrong'}
>>> keylist = ['HMD1', 'HMD2', 'HMD4']
>>> for key in keylist:
...     if key in data:
...             print data[key]
...
[1, 2, 3]
['g', 'h', 'i']
123

Upvotes: 1

Related Questions