Как отсортировать строки alphanumeri c в матрице numpy и список в Python? - PullRequest
3 голосов
/ 10 апреля 2020

У меня есть список, преобразованный из dict с 3-х функциональным ключом, например,

{('consumer0', 'consumer0', 0): 0}

Чтобы отсортировать список, я сделал

    time = np.arange(1)
    agent = ['consumer0', 'consumer10', 'consumer11', 'consumer20',
             'consumer1', 'consumer2', 'consumer3', 'consumer4',
             'consumer5', 'consumer6', 'consumer7', 'consumer8',
             'consumer9']
    P_nm = {}
    for t in time:
        for p1 in agents:
            for p2 in agents:
                P_nm[p1, p2, t] = t

    P_nm = [(k, v) for k, v in P_nm.items()]
    P_nm.sort(key=lambda k: (k[0][2], k[0][0], k[0][1]))

Я получил результат как:

[(('consumer0', 'consumer0', 0), 0), 
 (('consumer0', 'consumer1', 0), 0), 
 (('consumer0', 'consumer10', 0), 0), 
 (('consumer0', 'consumer11', 0), 0), 
 (('consumer0', 'consumer2', 0), 0), 
 (('consumer0', 'consumer20', 0), 0), 
 (('consumer0', 'consumer3', 0), 0),
 ...]

Как мне отсортировать список и получить результат как

[(('consumer0', 'consumer0', 0), 0), 
 (('consumer0', 'consumer1', 0), 0), 
 (('consumer0', 'consumer2', 0), 0), 
 (('consumer0', 'consumer3', 0), 0), 
 (('consumer0', 'consumer4', 0), 0),
 ...
 (('consumer0', 'consumer10', 0), 0), 
 (('consumer0', 'consumer11', 0), 0)
 ...
]

1 Ответ

0 голосов
/ 13 апреля 2020

Есть библиотека с именем natsort, которая делает именно то, что вы хотите. Он делает что-то похожее на то, что предлагает @ комментарий Криса , но в более общем смысле и охватывает гораздо больше угловых случаев .

natsort доступно в Anaconda и PyPi, поэтому conda install natsort и pip install natsort должны оба работать.

Чтобы использовать его, начните с функции natsorted, аналогично встроенной sorted, но с нужной вам функциональностью.

mylist = [
    (('consumer0', 'consumer0', 0), 0), 
    (('consumer0', 'consumer1', 0), 0), 
    (('consumer0', 'consumer10', 0), 0), 
    (('consumer0', 'consumer11', 0), 0), 
    (('consumer0', 'consumer2', 0), 0), 
    (('consumer0', 'consumer20', 0), 0), 
    (('consumer0', 'consumer3', 0), 0),
    ...
]
mylist = natsorted(mylist, key=lambda item: item[0][:2])

Поскольку natsort довольно умен в распаковке структуры элементов, ваш кейс может быть уменьшен до

mylist = natsorted(mylist)

Так как это может произойти, я не автор natsort ( этот парень ). Просто счастливый пользователь.

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