我遇到以下代码问题。我正在尝试从CSV文件中读取数据以创建嵌套的dictonary。当我第一次运行它时,它完全按照我的意图运行,但是当我运行它两次时,它会改变输出的顺序。有没有人知道为什么这是hapening?我正在使用Python 3.4。
import csv
delimiter = ';'
result = {}
with open("F:\\Python Projects\\Database.csv", 'r') as data_file:
data = csv.reader(data_file, delimiter=delimiter)
headers = next(data)[1:]
for row in data:
temp_dict = {}
name = row[0]
values = []
for x in row[1:]:
values.append(x)
for i in range(len(values)):
temp_dict[headers[i]] = values[i]
result[name] = temp_dict
print(result)
我的输入如下:
结果如下:
当我运行代码两次时,第1列显示了不同的顺序。
答案 0 :(得分:0)
从the docs我们有这个有用的说明:
CPython实现细节:键和值以任意顺序列出,非随机,在Python实现中各不相同,并且取决于字典的插入和删除历史。
事实证明,如果您可以预测字典键的存储顺序,则可以在Web应用程序上进行一种聪明的攻击形式。击败这种聪明的攻击只需要通过使用一个随机的种子"来改变哈希的工作方式。每一个哈希。这使得字典排序变得不可预测,这解决了聪明的攻击问题。但这意味着你不能转储字典的内容,每次都以相同的顺序得到相同的结果。
您可以通过以下两种方式之一获得有序结果。首先,您可以使用collections.OrderedDict
或(可能是更好的解决方案),您可以进行单独的订购阶段,在此阶段应用您想要的任何逻辑。
通常情况下,单独的订购阶段将类似于:
for k,v in sorted(d.items()):
print("\t{}: {}".format(k,v))