我有一本字典:
{'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{_id:'ub'}, {_id: 'da'}, {_id: 'rd'}, {_id: 'ac'}]}
我想对此列表进行排序,以便listToSort中的id与sortedOrder的排序方式相匹配
[{_id:'da'}, {_id: 'ub'}, {_id: 'ac'}, {_id: 'rd'}]
我必须将listToSort中的值与来自sortingOrder的值进行比较并相应地对listToSort进行排序,这是我的主要问题。
id可以是任何类型的字符,只需要按sortOrder排序的方式进行排序。
我必须按部分标题排序的文件样本:
{
"storeOrder": ["produce", "bread", "spreads", "deli", "dairy"],
"itemList": [
{
"_id": 9,
"amountNumber": 1,
"amountStr": "2 loaves",
"amountUnits": null,
"estPrice": null,
"listId": 3,
"modified": "2010-10-26 18:11:58",
"name": "white bread",
"notes": null,
"price": null,
"section": "bread",
"status": 1
},
{
"_id": 12,
"amountNumber": 1,
"amountStr": "1 jar",
"amountUnits": null,
"estPrice": null,
"listId": 3,
"modified": "2010-10-26 18:11:58",
"name": "raspberry jam",
"notes": "large bottle",
"price": null,
"section": "spreads",
"status": 0
}
}
答案 0 :(得分:2)
您可以将中间字典映射索引转换为字符串,并使用它来对id列表进行排序:
d1 = {'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{"id":'ub'}, {"id": 'da'}, {"id": 'rd'}, {"id": 'ac'}]}
l = d1['listToSort']
sort_keys = {s: i for i, s in enumerate(d1["sortingOrder"])}
print(sorted(l, key=lambda d: sort_keys[d["id"]]))
[{'id': 'da'}, {'id': 'ub'}, {'id': 'ac'}, {'id': 'rd'}]
l中的dicts将按其值显示在"sortingOrder"
列表中的顺序排序。
如果要对列表 inplace 进行排序,以便对原始列表进行排序,只需使用list.sort
:
l.sort(key=lambda d: sort_keys[d["id"]])
如果要按名称断开实际数据中的联系,请使用名称作为辅助键进行排序:
key=lambda d: (sort_keys[d["id"]], d["name"])
答案 1 :(得分:1)
如果我正确理解了您的任务,您可以重新创建一个列表。类似的东西:
_id = xrange(4)
a = {'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{_id[0]:'ub'}, {_id[1]: 'da'}, {_id[2]: 'rd'}, {_id[3]: 'ac'}]}
arr = [{i.keys()[0]:e} for e in a['sortingOrder'] for i in a['listToSort'] if i.values()[0] == e ]
a['listToSort'] = arr
print a['listToSort']
输出
[{1: 'da'}, {0: 'ub'}, {3: 'ac'}, {2: 'rd'}]
更新
a = {'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{'SortingKey':'ub'}, {'SortingKey': 'da'}, {'SortingKey': 'rd'}, {'SortingKey': 'ac'}]}
arr = [i for e in a['sortingOrder'] for i in a['listToSort'] if i['SortingKey'] == e ]
答案 2 :(得分:1)
您可以使用key
parameter to sort使用其中一个属性或字段对字典列表(或任何对象)进行排序。 key
参数需要一个函数。列表中的每个元素都将传递给此函数,返回值将用于对元素进行排序。在这种情况下,我们可以使用lambda
创建一个简单的函数,这使我们能够在一行中完成所有操作。
d = {'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{id:'ub'}, {id: 'da'}, {id: 'rd'}, {id: 'ac'}]}
d['listToSort'].sort(key=lambda x: d['sortingOrder'].index(x['id']))
一个警告是,它要求id
列表中实际存在每个sortingOrder
值,否则它将抛出ValueError
。
根据您的更新,您可以在key
sort
函数之前返回排序字段的元组,从而对多个字段的字典列表进行排序
d['itemList'].sort(key=lambda x: (d['storeOrder'].index(x['section']), x['name']))