我希望能够对对象列表进行排序(现在让我们说字典),但是我不想在列表中重新排列它们的位置,而是希望将每个对象的属性设置为一个整数值,表示它在序列中的位置。
例如,假设我有一个这样的列表:
mylist = [
{
'date': '2018-07-02',
'sequence': null
},
{
'date': '2015-01-03',
'sequence': null
},
{
'date': '2017-05-12',
'sequence': null
},
...
]
我想要一个看起来像这样的函数
assign_sequence(my_list, key='date', sequence_property='sequence')
并输出:
[
{
'date': '2018-07-02',
'sequence': 3
},
{
'date': '2015-01-03',
'sequence': 1
},
{
'date': '2017-05-12',
'sequence': 2
},
...
]
原因是数据最终是针对需要序列号并且无法使用序列号的旧系统的。
当然,我可以按照传统方式对它们进行排序,然后使用enumerate()再次对其进行迭代并分配索引。但是我只是想知道是否有更有效或更优雅的方式。
答案 0 :(得分:3)
这是“ argsort”。我会按照您所说的“传统方式”来做,因为它值得。假定日期字符串全部为%Y-%m%-%d
格式,则日期字符串将按照字典顺序正确排序。
>>> null = None
>>> mylist = [
... {
... 'date': '2018-07-02',
... 'sequence': null
... },
...
... {
... 'date': '2015-01-03',
... 'sequence': null
... },
... {
... 'date': '2017-05-12',
... 'sequence': null
... },
... ]
>>> from operator import itemgetter
>>> for i, d in enumerate(sorted(mylist, key=itemgetter('date')), start=1):
... d['sequence'] = i # mutate dicts in place
...
>>> mylist
[{'date': '2018-07-02', 'sequence': 3},
{'date': '2015-01-03', 'sequence': 1},
{'date': '2017-05-12', 'sequence': 2}]
numpy.argsort
可能会在您拥有大量数据且性能至关重要的情况下为您提速,但不要打扰。