[英]iterate over a subset of dictionary keys
我正在尋找學習如何將字典中的某些鍵/值傳遞給for循環內的另一個函數。 “某些”鍵都共享相同的初始字符串,並以尾隨整數遞增,如下所示:
data = {}
data["HMD1"] = [a,b,c]
data["HMD2"] = [d,f,g] #and so on...
同一字典中還有其他名稱不同的鍵。 現在在一個for循環中,我想將每個以“ HMD”開頭的鍵的值傳遞給另一個函數。 這是失敗嘗試的最小工作示例:
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))))])
這是一個很糟糕的猜測,因為eval()嘗試評估“ HMD1”,它不是變量而是數據中的鍵,因此它當然會返回錯誤。 有人知道如何正確執行此操作嗎?
只需使用for循環遍歷字典,然后使用if語句檢查鍵的有效性:
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
這是一個快速的工作示例:
>>> 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
在進一步了解您想要的內容之后,您也可以向后看,創建鍵字符串並打印這些鍵指向的值:
#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]
還有一個可行的例子。
>>> 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
您根本不需要eval
。 例如,您只需要使用.format
構建字符串
for f in range(1,4): #range don't include the end point
out = dummyfun(data["HMD{}".format(f)])
有了這個,你就會得到欲望的結果。 但是,如果密鑰不在dict中,那將失敗,您可以先檢查它,捕獲異常,或者在不存在所需密鑰的情況下提供默認值
#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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.