繁体   English   中英

按另一个列表的排序顺序对列表进行排序

[英]Sort a list by the sorted order of another list

我有一本字典,例如:

{'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{_id:'ub'}, {_id: 'da'}, {_id: 'rd'}, {_id: 'ac'}]}

我想对该列表进行排序,以便listToSort中的ID与sortingOrder的排序方式匹配

[{_id:'da'}, {_id: 'ub'}, {_id: 'ac'}, {_id: 'rd'}] 

我必须将listToSort中的值与sortingOrder中的值进行比较,并相应地对listToSort进行排序,这是我的主要问题。

id可以是任何类型的字符,只需要按照sortingOrder的排序方式进行排序即可。

我必须按部分标题对文件样本进行排序:

{
"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
    }
}

您可以将中介字典映射索引创建为字符串,然后使用该索引对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中的字典将根据其值在"sortingOrder"列表中的位置进行排序。

如果要就地对列表进行排序,以便对原始列表进行排序,请使用list.sort

  l.sort(key=lambda d: sort_keys[d["id"]])

如果您想按名称断开实际数据中的联系,则可以使用该名称作为辅助键进行排序:

   key=lambda d: (sort_keys[d["id"]], d["name"])

如果我正确理解了您的任务,则可以重新创建一个列表。 就像是:

_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'}]

UPDATE

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  ]

通过使用key参数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

根据您的更新,您可以通过返回用于sortkey函数的排序字段的元组来对多个字段的字典列表进行sort

d['itemList'].sort(key=lambda x: (d['storeOrder'].index(x['section']), x['name']))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM