我必须从文本文件中制作两个字典化合物字典。它们在文本文件中以数字顺序列出,从C00001到C20990(C表示复合),然而,当我打印字典时,一切都乱七八糟,而不是数字顺序。我怎么能改变呢?另外,有没有办法在键的左侧放置双引号,在值字符串的右侧有另一个双引号?并且,另外,当我尝试打印它以便每个键都有一个新行时,它告诉我我有一个键错误(特别是对于条目C20990。我假设这是因为它是字典中的最后一个) ,但这只会发生,如果它已经是数字顺序,它不是,所以它让我担心在最后的for循环中,它会发生更多的条目)
import sys
entries = []
names = []
a = {} #achiral
c = {} #chiral
for line in file:
if line.startswith("ENTRY"):
s = line[5:len(line)]
s = s.split()
entries.append(s[0])
if line.startswith("NAME"):
s = line[4:len(line)]
s = s.strip()
st = "".join(s+" ")
line=next(file)
check = False
while not line.startswith("FORMULA") and not line[0].isalpha():
s = line.strip()
if s.find("(R)")>=0:
check = True
if s.find("(S)")>=0:
check = True
if s.find("L-")>=0:
check = True
if s.find("D-")>=0:
check = True
st+=s+" "
line = next(file)
st = st.strip()
if not check:
a[entries[-1]] = st
else:
c[entries[-1]] = st
names = []
st = ""
for key in c:
print("{0}: {1}".format(key, c[entries[-1]]))
答案 0 :(得分:0)
Python词典是无序的。您可以在打印前对它们进行排序。
for key, value in sorted(c.items()):
print("{0}: {1}".format(key, value))
我不确定您为什么会收到密钥错误,但可以将其添加到字典a
而不是c
。
答案 1 :(得分:0)
Python dict
是一个未分类的容器,实现为There are many threads。哈希字符串“随机化”他们的订单。甚至这个顺序在将它们实际插入散列结构时也不会被保留。
>>> sorted(string.ascii_uppercase, key=hash)
['G', 'Z', 'M', 'V', 'L', 'K', 'C', 'J', 'P', 'N', 'D', 'O', 'Q', 'F', 'S', 'R', 'W', 'E', 'X', 'A', 'Y', 'B', 'I', 'U', 'H', 'T']
>>> set(_)
{'F', 'M', 'B', 'W', 'G', 'D', 'A', 'C', 'X', 'R', 'K', 'E', 'N', 'V', 'U', 'Q', 'T', 'Z', 'S', 'I', 'L', 'P', 'J', 'H', 'Y', 'O'}
如果要对键进行排序,请对其进行明确排序:
for key in sorted(c.keys()):
print("{0}: {1}".format(key, c[entries[-1]]))
答案 2 :(得分:0)
当我去打印字典时,一切都乱七八糟,而不是数字顺序。我怎么能改变呢?
Python字典使用哈希表以无序方式索引所有键。另外,您使用的密钥C20990
为string
,但您可以轻松提取数字并将其转换为int
。
我建议您在将其添加到条目时执行此操作,即在第一个if
子句中,使用
s = s.split()
s = int(s[1:])
在打印输入
之前对键进行排序for key in sorted(c.keys()):
另外,有没有办法在键的左侧放一个双引号,另一个双引号在值字符串的右侧?
是的,请使用output formatting。
另外,当我尝试打印它以便每个键都有一个新行时,它告诉我有一个键错误(特别是对于条目C20990)。
您使用c[entries[-1]]
,但此条目可能是非手性的,属于字典a
。您需要使用c
的密钥,请参阅Q1中的代码。