设置序列号属性的Python 2.7排序函数

时间:2018-07-02 22:47:55

标签: python python-2.7 sorting

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

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

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()再次对其进行迭代并分配索引。但是我只是想知道是否有更有效或更优雅的方式。

1 个答案:

答案 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可能会在您拥有大量数据且性能至关重要的情况下为您提速,但不要打扰。