使用值为字符串的python排序json文件

时间:2016-10-04 06:13:27

标签: python json

我有json文件:

ll = {"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"James", "lastName":"Bond"},
    {"firstName":"Celestial", "lastName":"Systems"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

我想按键(姓氏或名字)排序

我知道我们使用数字作为值的排序方法,但我无法按值将其排序为字符串。

我试过以下:

#data = json.load(file)
new = sorted(data, key = lambda k: k['employees'].get('lastName',0))

并收到错误:

TypeError: string indices must be integers

2 个答案:

答案 0 :(得分:1)

您需要将对象列表提供给sorted,而key应该是获取单个对象值的方法。

In [1]: ll = {"employees": [{"name": "abc"}, {"name": "bcd"}]}

In [2]: sorted(ll['employees'], key=lambda x: x['name'])
Out[2]: [{'name': 'abc'}, {'name': 'bcd'}]

如您所见,我获得了sorted的员工名单。然后sorted对该列表的每个元素运行lambda(因此它会在x['name']上调用{"name": "abc"}并获取name。然后sorted对元素进行排序使用键列表(如果它的字符串或数字也无关紧要 - 字符串也是数字 - ascii)。

当您对列表进行排序后,您可以将其分配到ll['employees']或任何其他位置。

无论如何,猜测你的代码(因为你没有包含所有代码)我假设你在sorted上呼叫dict,而不是list。您也使用了错误keyk不是完整对象,但list中的单个元素已传递给已排序的。)

答案 1 :(得分:1)

您可以使用ll["employees"]方法对list.sort列表进行就地排序。虽然您可以使用lambda滚动自己的关键功能,但使用operator.itemgetter更清晰,更高效。

在此代码中,我的key函数创建lastName后跟firstName的元组,因此列表主要按lastName排序,但具有相同{{1}的人按lastName排序。

firstName

<强>输出

from operator import itemgetter
from pprint import pprint

ll = {"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Patti", "lastName":"Smith"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"James", "lastName":"Bond"},
    {"firstName":"Celestial", "lastName":"Systems"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

ll["employees"].sort(key=itemgetter("lastName", "firstName"))
pprint(ll)