【发布时间】:2020-07-22 23:41:27
【问题描述】:
我有一个从具有 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)
...
]
【问题讨论】:
-
如果字符串是固定长度的,你可以试试
sorted(l, key=lambda x: (x[0][2], int(x[0][0][8:]), int(x[0][1][8:])))。否则,我会推荐re提取数字 -
在初始声明
agents = ["consumer{0}".format(i_s) for i_s in sorted([int(o.replace("consumer", "")) for o in agents])]之后直接对代理列表进行排序并删除P_nm = [(k,v) for k,v in P_nm.items()]行,我认为因为您没有任何索引而更具可读性 -
您应该对您的消费者编号(例如 consumer09)进行零填充,以确保它们按您的预期排序
-
非常感谢克里斯!它非常适合这种情况,有效!