2016-12-02 17 views
2

for循環和字典字符串控制我寫了一個字典:可以用Python

msgs = {"msg_1" : "a", "msg_2" : "b", "msg_3" : "c"} 

現在我不想在字典人工讀取,因爲我不知道有多少元素將在那裏(我從文件中讀取的字典):

z = "msg_{j}" 
for i in range(1, len(msgs) - 1): 
    y = z.format(j=i) # This makes it "msg_1", "msg_2", "msg_3", ... 
    print(msgs[y]) 

這將引發KeyError: msg_1。 如果我打印出一個接一個的它工作得很好:

print(msgs["msg_1"]) 
print(msgs["msg_2"]) 
print(msgs["msg_3"]) 

... a 
... b 
... c 

任何想法的原因是什麼? 這是爲什麼?

我測試了所有的功能和一切正常工作,直到我到循環部分(如果我使用print()而不是循環它工作正常)。

+2

您顯示的代碼似乎解決了您在實際代碼中遇到的問題。在另一個說明中,'range(1,len(msgs)-1)'只會遍歷1個項目 - 因爲範圍停在'n-1',所以你需要'range(1,len(msgs)+1) ' – karthikr

回答

1

你想迭代你的字典。

對於Python 2.x的:

for key, value in msgs.iteritems(): 

對於Python 3.x的:

for key, value in msgs.items(): 

更多細節可以發現here

1

在你的情況下,len(msgs) + 1取代len(msgs) - 1

msgs = {"msg_1" : "a", "msg_2" : "b", "msg_3" : "c"} 

z = "msg_{j}" 
for i in range(1, len(msgs) + 1): 
    y = z.format(j=i) # This makes it "msg_1", "msg_2", "msg_3", ... 
    print(msgs[y]) 


# Output 
a 
b 
c 
0

退房從SarTheFirst解決方案。如果你想在有序進行打印:

for key in sorted(msg): 
    print(msgs[key]) 
+1

如果他們有100個項目,它們可能未按照他們想要的方式排序,如msg_1,msg_10,msg_100,msg_11,msg_12,...。 – Duncan

1

我認爲你缺少dict對象的.keys()方法。它返回dict對象中所有鍵的列表。

for key in msgs.keys(): 
    print msgs[key] 
0

大家都謝謝,我找到了解決我的問題。

string = "msg_{j}" 

不工作,不知道爲什麼。 但什麼工作,是你使用r""。 所以string = r"msg_{j}"工作,出於某種原因。