Python 2.7 排序函数,用于设置序列号属性



我希望能够对对象列表进行排序(现在假设字典(,但我想在每个对象上设置一个属性,而不是将它们在列表中的位置设置为一个整数值,该值表示它在序列中的位置。

例如,假设我有一个这样的列表:

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"。我会按照你所说的"传统方式"来做,因为它的价值。日期字符串将使用字典顺序正确排序,假设它们都是%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可能会给您一个加速,但不要打扰其他方面。

最新更新