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

标签 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() 再次遍历它们并分配索引。但我只是想知道是否有更有效或更优雅的方式。

最佳答案

这是“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/

相关文章:

algorithm - 基于子集倒置的排序算法

algorithm - 使用快速排序算法对 K 排序数组进行排序的时间复杂度

Python 属性错误 : type object 'x' has no attribute 'x'

python - 获取导入错误 : No module named control when following google cloud endpoint tutorial

sql - 使用聚合函数更新 json 数组

python-2.7 - 安装了 Python 的 Docker ASPNET Core 容器

python-2.7 - 只读文件系统 : '/dev/null' while running google-cloud-sdk project

python - beautifulsoup 和无效的 html 文档

Python 等效于 mysql_real_escape_string,用于将字符串安全地导入 MySQL?

algorithm - 加快工作表的查找和替换 Google Apps 脚本功能