带拆分字符串的Python双排序

2024-09-20 22:23:56 发布

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

我试图对某些东西进行双重排序,但它似乎忘记了第一个排序,我认为python使用稳定排序,所以我可能犯了一个错误。在

原始文本是一个如下所示的数组:

benzene - 30.0 - 15
xylene - 5.0 - 10
benzene - 8.5 - 29
benzene - 0.5 - 11

我想要:

^{pr2}$

这是我的代码:

def akey(a):
    z = a.split(' -')
    v = [z[0]]
    x = [str(i) for i in v]
    return x

def bkey(b):
    z = b.split(' -')
    v = [z[1]]
    x = [float(i) for i in v]
    return x

labelList.sort(key=akey)
labelList.sort(key=bkey)

谢谢你的帮助


Tags: keyin文本forreturn排序def错误
3条回答

你为什么不先把bkey和akey放在一起

基本上你有两个优先顺序来排序。。。你最左边的人优先。所以如果你从右边开始排序,你会得到你想要的结果。在

可以通过拆分将每个字符串转换为列表,然后按标准方式对这些列表进行排序:

>>> l = ["ABC - 0.2 - 15", "BAC - 1.2 - 10", "ABC - 1.3 - 29", "ABC - 0.7 - 11"]
>>> l.sort(key=lambda x: x.split(' - ')[:2])
>>> l
['ABC - 0.2 - 15', 'ABC - 0.7 - 11', 'ABC - 1.3 - 29', 'BAC - 1.2 - 10']

正如@NullUserException所说,您不能分两步进行排序,因为第二步将只根据中间列进行重组,而忽略第一列(str)。在

在适当转换数据后,您可以一次性完成排序,而且不必担心键:

s='''ABC - 0.2 - 15
BAC - 1.2 - 10
ABC - 1.3 - 29
ABC - 0.7 - 11'''

data = s.split('\n')

data
Out[5]: ['ABC - 0.2 - 15', 'BAC - 1.2 - 10', 'ABC - 1.3 - 29', 'ABC - 0.7 - 11']

newdata = [(i[0],float(i[1]),i[2]) for i in [k.split(' - ') for k in data]]

newdata
Out[10]: 
[('ABC', 0.2, '15'),
 ('BAC', 1.2, '10'),
 ('ABC', 1.3, '29'),
 ('ABC', 0.7, '11')]

sorted(newdata)
Out[11]: 
[('ABC', 0.2, '15'),
 ('ABC', 0.7, '11'),
 ('ABC', 1.3, '29'),
 ('BAC', 1.2, '10')]

另一种方法:如果输入数据重组需要大量操作,则使用lambda键可能是更简单的方法:

^{pr2}$

相关问题 更多 >

    热门问题