我有4个dicts(总是4个)的列表,看起来像这样:
[{'id':'1','name':'alfa'},{'id':'2','name':'bravo'},{'id':'3','name':'charlie'},{'id':'4','name':'delta'}]
我完全知道我想要的顺序,即:
2, 3, 1, 4
最简单的重新排序方式是什么?
答案 0 :(得分:4)
如果总是四,你总是知道订单,就像这样:
lst = [{...},{...},{...},{...}]
ordered = [lst[1],lst[2],lst[0],lst[3]]
如果您打算按“id”按顺序对它们进行排序:
ordered = sorted(lst, key=lambda d: [2,3,1,4].index(int(d['id'])))
请注意,index()
为O(n)
,但不要求您构建字典。因此,对于小输入,这实际上可能更快。在您的情况下,有四个元素,保证十个比较。使用timeit
,此代码段的运行速度比tokland基于字典的解决方案快10%......但它并不重要,因为它们都不会很重要。
答案 1 :(得分:3)
这是一个非常通用的函数来强加一个想要的订单(任何不在所需订单中的键值都放在结果列表的末尾,按任意子顺序排列):
def ordered(somelist, wantedorder, keyfunction):
orderdict = dict((y, x) for x, y in enumerate(wantedorder))
later = len(orderdict)
def key(item):
return orderdict.get(keyfunction(item), later)
return sorted(somelist, key=key)
您将其用作
import operator
sortedlist = ordered(dictlist, ('2', '3', '1', '4'),
operator.itemgetter('id'))
答案 2 :(得分:2)
the_list.sort(key=lambda x: (3, 1, 2, 4)[int(x["id"])-1])
一个更简单的新答案
the_list = [the_list[i - 1] for i in (2, 3, 1, 4)]
通过这种方式,OP可以看到他想要的排序,并且排序没有愚蠢,这里不需要。它可能也很快。
答案 3 :(得分:2)
非通用解决方案:
lst = [{'id':'1','name':'alfa'},{'id':'2','name':'bravo'},{'id':'3','name':'charlie'},{'id':'4','name':'delta'}]
order = ["2", "3", "1", "4"]
indexes = dict((idfield, index) for (index, idfield) in enumerate(order))
print sorted(lst, key=lambda d: indexes[d["id"]])
# [{'id': '2', 'name': 'bravo'}, {'id': '3', 'name': 'charlie'}, {'id': '1', 'name': 'alfa'}, {'id': '4', 'name': 'delta'}]
这里概括:
def my_ordered(it, wanted_order, key):
indexes = dict((value, index) for (index, value) in enumerate(wanted_order))
return sorted(it, key=lambda x: indexes[key(x)])
import operator
print my_ordered(lst, order, operator.itemgetter("id"))
答案 4 :(得分:0)
如果您想重新订购而不考虑dicts的内容:
>>> order = 2, 3, 1, 4
>>> d = [{'id':'1','name':'alfa'},{'id':'2','name':'bravo'},{'id':'3','name':'charlie'},{'id':'4','name':'delta'}]
>>> index = dict(enumerate(dd))
>>> [index[i-1] for i in order]
[{'id': '2', 'name': 'bravo'}, {'id': '3', 'name': 'charlie'}, {'id': '1', 'name': 'alfa'}, {'id': '4', 'name': 'delta'}]
如果您希望将排序基于dicts的'id'
:
>>> sorted(d, key=lambda x: order.index(int(x['id'])))
[{'id': '2', 'name': 'bravo'}, {'id': '3', 'name': 'charlie'}, {'id': '1', 'name': 'alfa'}, {'id': '4', 'name': 'delta'}]