python - 如何在Python3中对复杂列表进行自然排序?

标签 python python-3.x sorting natural-sort

我可以对简单列表进行自然排序,也可以对复杂列表中的特定键进行正常排序。我需要对复杂列表中的键进行自然排序。

鉴于此程序:

import re

def atof(text):
    try:
        retval = float(text)
    except ValueError:
        retval = text
    return retval

def natural_keys(text):
    '''
    alist.sort(key=natural_keys) sorts in human order
    http://nedbatchelder.com/blog/200712/human_sorting.html
    (See Toothy's implementation in the comments)
    float regex comes from https://stackoverflow.com/a/12643073/190597
    '''
    return [ atof(c) for c in re.split(r'[+-]?([0-9]+(?:[.][0-9]*)?|[.][0-9]+)', text) ]

alist=[
    "something1",
    "something2",
    "something10.0",
    "something1.25",
    "something1.105"]

alist.sort(key=natural_keys)
print("alist:")
for i in alist: print(i)

from operator import itemgetter

blist=[
    ['a', "something1"],
    ['b', "something2"],
    ['c', "something10.0"],
    ['d', "something1.25"],
    ['e', "something1.105"]]

blist.sort(key=itemgetter(1))
print("\nblist:")
for i in blist: print(i[1])

我得到这些结果:

alist:
something1
something1.105
something1.25
something2
something10.0

blist:
something1
something1.105
something1.25
something10.0
something2

如何让 blist 与 alist 排序相同?

最佳答案

您可以使用 lambda 代替 itemgetter

blist.sort(key=lambda x: natural_keys(x[1]))

关于python - 如何在Python3中对复杂列表进行自然排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58221762/

相关文章:

python - 基于两个目标对数组进行排序

python - 删除目录 python3 中最旧的文件

python - 从 Image Generator 绘制图像

Python TypeError : expected string or buffer. 需要字典中的响应

python - 加载音频文件并查找频率

python - 在python中导入osgeo库失败

java - Java 中的快速排序未正确排序

python - input() 在 Spyder IDE 中带有感叹号 (!)

linux - ipsec 在 archlinux 下验证时出现 python 错误

python - Flask SQLAlchemy 导入数据库导入