如何在numpy矩阵中对字母数字字符串进行排序,在Python中如何对列表进行排序?

2024-10-01 22:43:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从带有3个特征键的dict转换而来的列表,例如

{('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)
 ...
]

Tags: in列表fortime排序nmp1consumer2
1条回答
网友
1楼 · 发布于 2024-10-01 22:43:22

有一个名为^{}的库,它完全满足您的需要。它做了一些类似于@Chris's comment建议的事情,但以更一般的方式,并且涵盖了更多的corner cases

natsort在anaconda和PyPi中可用,因此conda install natsortpip install natsort应该都能工作

要使用它,请从^{}函数开始,类似于内置的^{},但要使用所需的功能

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(this guyis)的作者。只是一个快乐的用户

相关问题 更多 >

    热门问题