Sven Marnach的答案存在边缘情况。
如果您尝试对一个包含两个产生相同搜索键但不同且无法直接排序的项目的列表进行排序,它将会崩溃。
mylist = [{'score':50,'name':'bob'},{'score':50,'name':'linda'}]
mylist_annotated = [(x['score'], x) for x in mylist]
mylist_annotated.sort()
print( [x for key, x in mylist_annotated] )
将会给予:
TypeError: '<' not supported between instances of 'dict' and 'dict'
幸运的是,我有一个简单的解决方案 - 我的数据有一个可排序的唯一键,所以我可以将其作为第二个键:
mylist = [{'score':50,'name':'bob','unique_id':1},{'score':50,'name':'linda','unique_id':2}]
mylist_annotated = [(x['score'], x['unique_id'], x) for x in mylist]
mylist_annotated.sort()
print( [x for key, unique, x in mylist_annotated] )
我猜如果你的数据没有自然唯一值,你可以在尝试排序之前插入一个?也许是uuid?
编辑:如评论中所建议(谢谢!),您也可以使用operator.itemgetter:
import operator
mylist = [{'score':50,'name':'bob'},{'score':50,'name':'linda'}]
mylist_annotated = [(x['score'], x) for x in mylist]
mylist_annotated.sort(key=operator.itemgetter(0))
print( [x for key, x in mylist_annotated] )
SyntaxError: 'await' expressions in comprehensions are not supported
的错误,所以我不得不这样做(供将来参考):mylist_annotated = [] for x in mylist: mylist_annotated.append((await some_function(x), x)) mylist_annotated.sort() mylist = [x for key, x in mylist_annotated]
现在它可以工作了,谢谢! - iCart