猿问

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

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


鉴于此程序:


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 相同?


慕码人8056858
浏览 108回答 1
1回答

至尊宝的传说

您可以使用 alambda而不是itemgetter.blist.sort(key=lambda x: natural_keys(x[1]))
随时随地看视频慕课网APP

相关分类

Python
我要回答