Функция сортировки Python 2.7, которая устанавливает свойство порядкового номера - PullRequest
0 голосов
/ 03 июля 2018

Я хочу иметь возможность сортировать список объектов (скажем, словари на данный момент), но вместо того, чтобы переупорядочивать их расположение в списке, я хотел бы установить для каждого свойства целое значение, которое представляет это место в последовательности.

Например, предположим, у меня есть такой список:

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 голосов
/ 03 июля 2018

Это "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 может дать вам ускорение, если у вас огромные данные и производительность критична, но не беспокойтесь об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...