我有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
答案 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
。您也使用了错误key
(k
不是完整对象,但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)