繁体   English   中英

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

[英]reordering list of dicts arbitrarily in python

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

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

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

2, 3, 1, 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%......但它并不重要,因为它们都不会很重要。

这是一个非常通用的函数来强加一个想要的订单(任何不在所需订单中的键值都放在结果列表的末尾,按任意子顺序排列):

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'))
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可以看到他想要的排序,并且排序没有愚蠢,这里不需要。 它可能也很快。

非通用解决方案:

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"))

如果您想重新订购而不考虑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'}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM