按密钥列表排序字典

时间:2014-07-18 15:16:02

标签: python dictionary

我已经尝试过查看这个问题,但我似乎无法找到符合我想要的方式的答案。

到目前为止的代码如下:

dictionary = {}
list = ["this", "is", "my", "list"]
definitions = [1, 2, 3, 4]
dictionary = dict(zip(list,definitions))
print dictionary

输出为:

{'this': 1, 'list': 4, 'is': 2, 'my': 3}

我需要输出格式为

{'this': 1, 'is': 2, 'my': 3', list': 4}

列表不能按字母顺序或数字顺序排序,因为我想要放入的实际值有些随机化。至关重要的是,订单按其列表形式的密钥顺序排序。

我尝试过使用下面的方法,但仍会返回相同的答案

from collections import OrderedDict
OrderedDict(sorted(dictionary.items(), key=lambda t: t[0]))

如果词典不是最好的方式,我更感兴趣的是学习更好的方法

提前致谢

3 个答案:

答案 0 :(得分:2)

您需要使用原始订单构建OrdereDict,并且根本不使用内置dict

keys = ["this", "is", "my", "list"]
definitions = [1, 2, 3, 4]
OrderedDict(zip(keys, definitions))

内置dict类型没有设置顺序,它是无序类型。排序将字母顺序应用于键,而不是原始顺序。

我在这里使用了名称keys而不是list来掩盖内置类型。

演示:

>>> from collections import OrderedDict
>>> keys = ["this", "is", "my", "list"]
>>> definitions = [1, 2, 3, 4]
>>> OrderedDict(zip(keys, definitions))
OrderedDict([('this', 1), ('is', 2), ('my', 3), ('list', 4)])

如果您关心的是您的密钥和值已正确配对,已经发生zip()按原始顺序将您的键和值配对,然后从这些配对中创建字典。然后,dict显示键和值的顺序并不重要,配对不会混淆。

答案 1 :(得分:2)

为什么不直接将数据放入OrderedDict

>>> from collections import OrderedDict
>>> data = ["this", "is", "my", "list"] # don't use list as a variable name
>>> d = OrderedDict(zip(data, range(1, 5)))
>>> d
OrderedDict([('this', 1), ('is', 2), ('my', 3), ('list', 4)])

请注意,您当前的尝试会按字母顺序按字母顺序排序键,但您可以这样做:

>>> d2 = dict(zip(data, range(1, 5)))
>>> d2
{'this': 1, 'list': 4, 'is': 2, 'my': 3}
>>> OrderedDict(sorted(d2.items(), key=lambda t: data.index(t[0])))
OrderedDict([('this', 1), ('is', 2), ('my', 3), ('list', 4)])

即。使用index列表中的data作为key的{​​{1}}。

答案 2 :(得分:0)

我建议你这样做:

import pandas as pd
list = ["this", "is", "my", "list"]
definitions = [1, 2, 3, 4]
df = pd.DataFrame({'definitions':definitions}, index=list)

这是df的样子:

    key  values
0  this       1
2    is       2
1    my       3
3  list       4

并且:

df.to_json()给出:

'{"definitions":{"this":1,"is":2,"my":3,"list":4}}'

正如评论中所说,这可能不是更好的方式。但这是一个选择!