2016-12-02 20 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}"工作,出于某种原因。