Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按另一个列表的排序顺序对列表进行排序_Python_Sorting - Fatal编程技术网

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

Python 按另一个列表的排序顺序对列表进行排序,python,sorting,Python,Sorting,我有一本字典,像: {'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{_id:'ub'}, {_id: 'da'}, {_id: 'rd'}, {_id: 'ac'}]} 我想对该列表进行排序,以便listToSort中的id与排序顺序相匹配 [{_id:'da'}, {_id: 'ub'}, {_id: 'ac'}, {_id: 'rd'}] 我必须将listToSort中的值与sortingOrder中的值进行比较,并相应地

我有一本字典,像:

{'sortingOrder': ['da','ub','ac','rd'], 'listToSort': [{_id:'ub'}, {_id: 'da'}, {_id: 'rd'}, {_id: 'ac'}]}
我想对该列表进行排序,以便listToSort中的id与排序顺序相匹配

[{_id:'da'}, {_id: 'ub'}, {_id: 'ac'}, {_id: 'rd'}] 
我必须将listToSort中的值与sortingOrder中的值进行比较,并相应地对listToSort进行排序,这一直是我的主要问题

id可以是任何类型的字符,只需按照排序顺序排序即可

我必须按章节标题排序的文件示例:

{
"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 = 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  ]

您可以使用字典(或任何对象)的属性或字段对字典列表(或任何对象)进行排序。
参数需要一个函数。列表中的每个元素都将传递到此函数,返回值将用于对元素进行排序。在这种情况下,我们可以使用
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

根据您的更新,您可以通过在
排序
函数的
中返回排序字段的元组,对多个字段上的词典列表进行排序

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

您可以将中间dict映射索引设置为字符串,并使用该索引对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中的DICT将按其值出现在
“排序顺序”
列表中的位置排序

如果您想在原地对列表进行排序,以便对原始列表进行排序,只需使用
list.sort

  l.sort(key=lambda d: sort_keys[d["id"]])
如果要按名称打破实际数据中的联系,请将该名称用作排序依据的辅助键:

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

如果字典中有多个id为的值,这会起作用吗?例如,如果每个id都标识了型号,而您也有一个带有型号的序列号。@Giovanni您可以在您的问题中添加带有输入数据的简短示例吗?我将需要排序的文件的一小部分放入其中。@Giovanni请参阅更新的答案<
listToSort
中的code>dict可以包含任何其他键。我没有否决它。但现在我的问题被否决了。。。不知道为什么您的
项目列表中的多个项目可以共享一个
部分
值?在这种情况下,是否有二级排序字段(例如
name
)?是的。如果它们相同,将使用名称进行排序。理想情况下,这将是一种稳定的类型