nig*_*bat 3 python sorting dictionary list
我有一个id列表,在适当的oder中排序:
ids = [1, 2, 4, 6, 5, 0, 3]
Run Code Online (Sandbox Code Playgroud)
我还有一个字典列表,以一些随机的方式排序:
rez = [{'val': 7, 'id': 1}, {'val': 8, 'id': 2}, {'val': 2, 'id': 3}, {'val': 0, 'id': 4}, {'val': -1, 'id': 5}, {'val': -4, 'id': 6}, {'val': 9, 'id': 0}]
Run Code Online (Sandbox Code Playgroud)
我的目的是以rez对应于以下方式的方式对列表进行排序ids:
rez = [{'val': 7, 'id': 1}, {'val': 8, 'id': 2}, {'val': 0, 'id': 4}, {'val': -4, 'id': 6}, {'val': -1, 'id': 5}, {'val': 9, 'id': 0}, {'val': 2, 'id': 3}]
Run Code Online (Sandbox Code Playgroud)
我试过了:
rez.sort(key = lambda x: ids.index(x['id']))
Run Code Online (Sandbox Code Playgroud)
然而这种方式对我来说太慢了,因为len(ids)> 150K,并且每个dict实际上有很多键(一些值有字符串).任何建议如何以最pythonic,但仍然最快的方式做到这一点?
您不需要sort因为ids指定结果的整个顺序.您只需要通过其ID选择正确的元素:
rez_dict = {d['id']:d for d in rez}
rez_ordered = [rez_dict[id] for id in ids]
Run Code Online (Sandbox Code Playgroud)
这使:
>>> rez_ordered
[{'id': 1, 'val': 7}, {'id': 2, 'val': 8}, {'id': 4, 'val': 0}, {'id': 6, 'val': -4}, {'id': 5, 'val': -1}, {'id': 0, 'val': 9}, {'id': 3, 'val': 2}]
Run Code Online (Sandbox Code Playgroud)
这应该比排序更快,因为它可以平均在线性时间内完成,而排序是O(nlogn).
请注意,这假设每个id将有一个条目,如您的示例所示.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |