在python中任意重新排序dicts列表

时间:2010-07-21 16:11:53

标签: python list

我有4个dicts(总是4个)的列表,看起来像这样:

[{'id':'1','name':'alfa'},{'id':'2','name':'bravo'},{'id':'3','name':'charlie'},{'id':'4','name':'delta'}]

我完全知道我想要的顺序,即:

2, 3, 1, 4

最简单的重新排序方式是什么?

5 个答案:

答案 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])

Update0

一个更简单的新答案

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