使用Python 3.x,我有一个字符串列表,我想对其执行自然的字母排序.
自然排序: Windows中文件的排序顺序.
例如,以下列表是自然排序的(我想要的):
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
Run Code Online (Sandbox Code Playgroud)
这是上面列表的"排序"版本(我有):
['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个行为与第一个类似的排序函数.
我正在重构我的一些旧代码,并且遇到了这个问题:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
Run Code Online (Sandbox Code Playgroud)
代码可以工作(我在大约3年前写过它!)但是我无法在Python文档的任何地方找到这个东西,并且每个人都使用它sorted()来实现自定义排序.有人可以解释为什么这有效吗?
我有一个包含jpgs和其他文件的目录,jpgs都有包含数字的文件名.有些文件名可能包含其他字符串.
例如.
01.jpg
Run Code Online (Sandbox Code Playgroud)
或者可能是
Picture 03.jpg
Run Code Online (Sandbox Code Playgroud)
在Python中,我需要按升序排列所有jpgs的列表.以下是此代码段
import os
import numpy as np
myimages = [] #list of image filenames
dirFiles = os.listdir('.') #list of directory files
dirFiles.sort() #good initial sort but doesnt sort numerically very well
sorted(dirFiles) #sort numerically in ascending order
for files in dirFiles: #filter out all non jpgs
if '.jpg' in files:
myimages.append(files)
print len(myimages)
print myimages
Run Code Online (Sandbox Code Playgroud)
我得到的就是这个
['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg',
'15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg',
'21.jpg', '22.jpg', '23.jpg', '24.jpg', …Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的列表(一个数字后跟一个句子),这里按正确的顺序:
-347 a negative number
-100 another negative number
-25 and again, a negative number
17 some text
25 foo bar
100 two same texts
100 two same texts (almost)
350 a positive number
Run Code Online (Sandbox Code Playgroud)
每次添加新项目时,我都需要对该列表进行排序.
我搜索了SO,发现答案:
在python中排序 - 如何对包含字母数字值的列表进行排序?
我使用的代码是奇特的,它是:
import re
def convert(str):
return int("".join(re.findall("\d*", str)))
list1.sort(key=convert)
Run Code Online (Sandbox Code Playgroud)
为了更好地解释我的问题,我洗了清单并运行了代码.
结果是:
17 some text
-25 and again, a negative number
25 foo bar
100 two same texts (almost)
100 two same texts
-100 another negative number
-347 a negative number
350 …Run Code Online (Sandbox Code Playgroud)