我试图对某些内容进行双重排序,而且它似乎忘记了第一种类型,我认为python使用稳定排序,所以我可能犯了一个错误。
原始文本是一个如下所示的数组:
benzene - 30.0 - 15
xylene - 5.0 - 10
benzene - 8.5 - 29
benzene - 0.5 - 11
我想:
benzene - 0.5 - 11
benzene - 8.5 - 29
benzene - 30.0 - 15
xylene - 5.0 - 10
这是我的代码:
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)
感谢您的帮助
答案 0 :(得分:1)
正如@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键可能更容易:
# data is a list of strings
data = ['ABC - 0.2 - 15', 'BAC - 1.2 - 10', 'ABC - 1.3 - 29', 'ABC - 0.7 - 11']
# My key is now a lambda function that extracts the
# sortable parts, and assembles them in a tuple.
# Note how easy it would be to change the sort order,
# just order the entries in the inner tuple differently.
# If data is some other array-like structure, just change
# how the inner data is accessed when building your tuple.
sorted(data, key=lambda x: (x.split(' - ')[0], float(x.split(' - ')[1])))
Out[18]: ['ABC - 0.2 - 15', 'ABC - 0.7 - 11', 'ABC - 1.3 - 29', 'BAC - 1.2 - 10']
答案 1 :(得分:0)
你为什么不尝试首先使用bkey然后按一下
基本上你有2个优先级来排序它们......你的最左边有更多优先权。因此,如果您从右侧开始排序,您将获得所需的结果。
答案 2 :(得分:0)
您可以通过拆分将每个字符串转换为列表,然后以标准方式对这些列表进行排序:
>>> 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']