[英]What is the Pythonic way of reordering a list consisting of 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])
一个新的更简单的答案
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.