我希望能够对对象列表(现在假设是字典)进行排序,但我不想重新排列它们在列表中的位置,而是想将每个对象的属性设置为一个整数值代表它在序列中的位置。
例如,假设我有一个这样的列表:
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() 再次遍历它们并分配索引。但我只是想知道是否有更有效或更优雅的方式。
最佳答案
这是“argsort”。我会按照你所说的“传统方式”来做,因为它的值(value)。日期字符串将使用字典顺序正确排序,假设它们都是 %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
如果您拥有海量数据并且性能至关重要,则可能会加快您的速度,但别担心。
关于设置序列号属性的 Python 2.7 排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51144561/