如何对 Python3 中的复杂列表进行自然排序?
How to do a natural sort on a complex list in 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
'''
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]))
我可以对简单列表进行自然排序,也可以对复杂列表中的特定键进行正常排序。我需要对复杂列表中的键进行自然排序。
给出这个程序:
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
'''
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]))