代码之家  ›  专栏  ›  技术社区  ›  John B

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

  •  4
  • John B  · 技术社区  · 6 年前

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

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

    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 回复  |  直到 6 年前
        1
  •  3
  •   wim    6 年前

    这是“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 如果你有大量的数据,性能是关键的,可能会给你一个加速,但不要担心其他。