按子字典的值对字典中的子字典进行排序

3
这是我的 JSON :
{"data": [{"L": "Leinster"}, {"RN": "Roscommon"}, {"G": "Galway"}, {"LS": "Laois"}, {"LD": "Longford"}, {"OY": "Offaly"}, {"KK": "Kilkenny"}, {"SO": "Sligo"}, {"C": "Connaught"}, {"CO": "Cork"}, {"M": "Munster"}, {"WD": "Waterford"}, {"CE": "Clare"}]}

我希望对字典进行排序,按值中的“abc”顺序排列,如下所示:
  {"data": [ {"CE": "Clare"},{"C": "Connaught"}, {"CO": "Cork"}, {"G": "Galway"},{"KK": "Kilkenny"}, {"LS": "Laois"},{"L": "Leinster"}, {"LD": "Longford"}, {"M": "Munster"},{"OY": "Offaly"}, {"RN": "Roscommon"}, {"SO": "Sligo"}, {"WD": "Waterford"} ]}

有什么想法吗?尝试了这个Python: sort this dictionary (dict in dict),但是它只能排序字典中的值,而不能排序字典中的键。

谢谢!

3个回答

4

对于Python 2

>>> d = {'data': [{'L': 'Leinster'}, {'RN': 'Roscommon'}, {'G': 'Galway'}, {'LS': 'Laois'}, {'LD': 'Longford'}, {'OY': 'Offaly'}, {'KK': 'Kilkenny'}, {'SO': 'Sligo'}, {'C': 'Connaught'}, {'CO': 'Cork'}, {'M': 'Munster'}, {'WD': 'Waterford'}, {'CE': 'Clare'}]}
>>> dict((k,sorted(v,key=dict.values)) for k,v in d.iteritems())
{'data': [{'CE': 'Clare'}, {'C': 'Connaught'}, {'CO': 'Cork'}, {'G': 'Galway'}, {'KK': 'Kilkenny'}, {'LS': 'Laois'}, {'L': 'Leinster'}, {'LD': 'Longford'}, {'M': 'Munster'}, {'OY': 'Offaly'}, {'RN': 'Roscommon'}, {'SO': 'Sligo'}, {'WD': 'Waterford'}]}

这里提供一个Python 3的解决方案,如果有更好的方法,请告知,因为我不太喜欢这个方法。
>>> {k:sorted(v,key=lambda x: tuple(x.values())) for k,v in d.items()}
{'data': [{'CE': 'Clare'}, {'C': 'Connaught'}, {'CO': 'Cork'}, {'G': 'Galway'}, {'KK': 'Kilkenny'}, {'LS': 'Laois'}, {'L': 'Leinster'}, {'LD': 'Longford'}, {'M': 'Munster'}, {'OY': 'Offaly'}, {'RN': 'Roscommon'}, {'SO': 'Sligo'}, {'WD': 'Waterford'}]}

1
+1,虽然我的有点不同但现在不会发出来,它也不会更好 :^) - jcomeau_ictx

1

或者你可以简单地执行

更新以按值排序

In [41]: r={"data": [{"L": "Leinster"}, {"RN": "Roscommon"}, {"G": "Galway"}, {"LS": "Laois"}, {"LD": "Longford"}, {"OY": "Offaly"}, {"KK": "Kilkenny"}, {"SO": "Sligo"}, {"C": "Connaught"}, {"CO": "Cork"}, {"M": "Munster"}, {"WD": "Waterford"}, {"CE": "Clare"}]}

In [42]: for v in r.itervalues():
....:     v.sort(key=dict.values)
....: 

In [43]: r
Out[43]:  
{'data': [{'CE': 'Clare'},
      {'C': 'Connaught'},
      {'CO': 'Cork'},
      {'G': 'Galway'},
      {'KK': 'Kilkenny'},
      {'LS': 'Laois'},
      {'L': 'Leinster'},
      {'LD': 'Longford'},
      {'M': 'Munster'},
      {'OY': 'Offaly'},
      {'RN': 'Roscommon'},
      {'SO': 'Sligo'},
      {'WD': 'Waterford'}]}

1
可以通过将 v.sort() 替换为 v.sort(key=dict.values) 来解决。 - srgerg
如果需要按内部字典的值进行排序,可以使用以下代码: - gsagrawal
我喜欢这个方法,因为它可以就地对列表进行排序,而不是创建一个新的字典,而且比我的笨拙解决方案更加优美。 - srgerg

1

又一个解决方案,因为越多越好!

>>> r={"data": [{"L": "Leinster"}, {"RN": "Roscommon"}, {"G": "Galway"}, {"LS": "Laois"}, {"LD": "Longford"}, {"OY": "Offaly"}, {"KK": "Kilkenny"}, {"SO": "Sligo"}, {"C": "Connaught"}, {"CO": "Cork"}, {"M": "Munster"}, {"WD": "Waterford"}, {"CE": "Clare"}]}
>>>
>>> map(functools.partial(list.sort, key=dict.values), r.itervalues())
[None]
>>>
>>> r
{'data': [{'CE': 'Clare'}, {'C': 'Connaught'}, {'CO': 'Cork'}, {'G': 'Galway'}, {'KK': 'Kilkenny'}, {'LS': 'Laois'}, {'L': 'Leinster'}, {'LD': 'Longford'}, {'M': 'Munster'}, {'OY': 'Offaly'}, {'RN': 'Roscommon'}, {'SO': 'Sligo'}, {'WD': 'Waterford'}]}

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