在Python中将字典转换为有序字典

12

我想在Python中将一个字典转换为有序字典

data = pandas.read_csv('D:\myfile.csv')
for colname, dtype in data.dtypes.to_dict().iteritems():
    if dtype == 'object':
        print colname
        count = data[colname].value_counts()
        d = dict((str(k), int(v)) for k, v in count.iteritems())
        f = dict(sorted(d.iteritems(), key=lambda item: item[1], reverse = True)[:5])
        print f

        m ={}
        m["count"]= int(sum(count))    
        m["Top 5"]= f    
        print m    
        k = json.dumps(m)
        print k    
f = {'Gears of war 3': 6, 'Batman': 5, 'gears of war 3': 4, 'Rocksmith': 5, 'Madden': 3}

我期望的输出是:

f = {'Gears of war 3': 6, 'Batman': 5, 'Rocksmith': 5, 'gears of war 3': 4, 'Madden': 3}
k = {'count':24, 'top 5':{'Gears of war 3': 6, 'Batman': 5, 'Rocksmith': 5, 'gears of war 3': 4, 'Madden': 3}}

(按值的降序排列,结果应该是一个字典)


1
你为什么想这样做,而不只是拥有一个已排序的列表呢? - emschorsch
2个回答

21

由于字典没有顺序,因此无法对其进行排序。

相反,可以使用collections.OrderedDict

>>> from collections import OrderedDict
>>> d = {'Gears of war 3': 6, 'Batman': 5, 'gears of war 3': 4, 'Rocksmith': 5, 'Madden': 3}

>>> od = OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True))
>>> od
OrderedDict([('Gears of war 3', 6), ('Batman', 5), ('gears of war 3', 4), ('Rocksmith', 5), ('Madden', 3)])

>>> od.keys()
['Gears of war 3', 'Batman', 'gears of war 3', 'Rocksmith', 'Madden']
>>> od.values()
[6, 5, 4, 5, 3]
>>> od['Batman']
5

你在JSON对象中看到的“顺序”是无意义的,因为JSON对象是无序的[RFC4267]。

如果你想要有意义的顺序,你需要使用一个列表(按你想要的方式排序)。像这样:

{
  "count": 24,
  "top 5": [
    {"Gears of war 3": 6},
    {"Batman": 5},
    {"Rocksmith": 5},
    {"gears of war 3": 4},
    {"Madden": 3}
  ]
}

给定相同的字典d,您可以通过以下方式生成已排序列表(这正是您想要的):

>>> l = sorted(d.items(), key=lambda x:x[1], reverse=True)
>>> l
[('Gears of war 3', 6), ('Batman', 5), ('Rocksmith', 5), ('gears of war 3', 4), ('Madden', 3)]

现在,您只需将l传递给m ['top5']并转储即可:

m["Top 5"]= l
k = json.dumps(m)

@emschorsch 我想把输出的字典添加到另一个字典中并将其转换为JSON响应。 - Code Ninja
@CodeNinja JSON对象没有顺序,因此您需要使用列表。 - K Z
JSON对象是无序的?告诉MongoDB吧 (: - Pavel Vlasov

1

有一个使用Apache许可证的库sortedcontainers,其中包含SortedDict

 sudo pip install sortedcontainers 

from sortedcontainers import SortedDict
sorted_dict = SortedDict({'a': 1, 'b': 2, 'c': 3})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接