从csv读取时保留dict中的顺序

时间:2017-01-25 05:57:41

标签: python csv dictionary

我有.csv文件,我想将csv转换为dict。 在我的代码下面:

c2:9f:db:67:12:48   c2:9f:db:e7:85:ad   06:27:22:fd:6b:50
      -67                 -51                 -110

我的.csv文件:

{u'c2:9f:db:e7:85:ad': u'-51', u'c2:9f:db:67:12:48': u'-67',u'06:27:22:fd:6b:50': u'-110'}

但我的字典结果是随机的:

{u'c2:9f:db:67:12:48': u'-67', u'c2:9f:db:e7:85:ad': u'-51', u'06:27:22:fd:6b:50': u'-110'}

我希望我的字典结果不是随机的:

WNCK_LIBS

4 个答案:

答案 0 :(得分:1)

从Python 3.6开始,字典将保留其插入顺序:https://mail.python.org/pipermail/python-dev/2016-September/146327.html

  

一种不错的副作用"紧凑的字典是现在的字典   保留插入顺序。

这是副作用"但是,并没有在官方规范中,因此可能无法保证在未来的版本中始终如此。

答案 1 :(得分:0)

根据定义,Python中的词典未订购,因此您无法维护(或依赖)从CSV文件中获取的元素的任何特定顺序。

Why is python ordering my dictionary like so?

答案 2 :(得分:0)

没有办法做你想做的事。根据定义,dictionaries in Python are unordered。正如文档所说,

  

最好将字典视为一组无序的键:值对,并要求键是唯一的(在一个字典中)。

无论条目是通过读取文件还是键入键盘来完成,Python都不关心您将键值对输入字典的顺序,只要每个键都是唯一的。键值对将以任意顺序存储。

这是为什么?这是因为字典存储在哈希表中。对唯一键进行哈希处理,并将键值对存储在结果位置。一个足够好的哈希算法应设计,以使哈希值不可预测。因此,始终按键排序字典的愿望与字典的构建方式是完全相反的。

答案 3 :(得分:0)

如果您想在dict中保留订单,可以使用OrderedDict

import csv
from collections import OrderedDict
testo = []
with open('dTest.csv', 'r') as f:
    reader = csv.reader(f)
    headers = next(reader)
    for row in reader:
        testo.append(OrderedDict(zip(headers, row)))

print(testo[0])

保证始终具有此输出:

OrderedDict([('c2:9f:db:67:12:48', '-67'), ('c2:9f:db:e7:85:ad', '-51'), ('06:27:22:fd:6b:50', '-110')])

除了订单,OrderedDict与普通Dict具有相同的属性,因此您可以例如使用for key in test[0]

循环遍历它