首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python将“U11-短语1000.wav”排序在“U11-短语101.wav”之前;我如何克服这一点?

Python将“U11-短语1000.wav”排序在“U11-短语101.wav”之前;我如何克服这一点?
EN

Stack Overflow用户
提问于 2009-12-21 13:17:45
回答 2查看 450关注 0票数 6

我运行Python2.5 (r25:51908,2006年9月19日,09:52:17) MSC v.131032位(英特尔)在win 32上

当我问Python

代码语言:javascript
复制
>>> "u11-Phrase 099.wav" <  "u11-Phrase 1000.wav"
True

这很好。当我问

代码语言:javascript
复制
>>> "u11-Phrase 100.wav" <  "u11-Phrase 1000.wav"
True

这也很好。当我问

代码语言:javascript
复制
>>> "u11-Phrase 101.wav" <  "u11-Phrase 1000.wav"
False

因此,根据Python,“U11-短语100.wav”出现在“U11-短语1000.wav”之前,而“U11-短语101.wav”出现在“U11-短语1000.wav”之后!这对我来说是个问题,因为我试图编写一个文件重命名程序,而这种排序破坏了功能。

我能做些什么来克服这个问题呢?我应该编写自己的cmp函数并测试边缘情况,还是有一个简单得多的快捷方式来给我所需的排序?

另一方面,如果我修改字符串,如

代码语言:javascript
复制
>>> "u11-Phrase 0101.wav" <  "u11-Phrase 1000.wav"
True

但是,这些字符串来自目录的文件列表,如:

代码语言:javascript
复制
files = glob.glob('*.wav')
files.sort()
for file in files:
    ...

所以我宁愿不对弦做手术,因为它们是由glob创造的。不,我也不想更改文件夹中的原始文件名。

有什么暗示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-21 13:23:39

你在找人类分类

101.wav不小于1000.wav的原因是计算机(不仅仅是Python)按字符对字符串进行排序,这两个字符串之间的第一个区别是第一个字符串有'1‘,第二个字符串有'0’。'1‘是不小于'0',所以字符串比较,正如你已经看到的。

人们自然地将这些字符串解析成它们的组件,并对数字进行数值解释,而不是从词汇上解释。我链接到的代码将进行同样的解析。

票数 16
EN

Stack Overflow用户

发布于 2009-12-21 13:29:23

您需要为每个文件名构造一个适当的排序键。像这样的事情应该做你想做的事:

代码语言:javascript
复制
import re

def k(s):
    return [w.isdigit() and int(w) or w for w in re.split(r'(\d+)', s)]

files = ["u11-Phrase 099.wav", "u11-Phrase 1000.wav", "u11-Phrase 100.wav"]

print files
print sorted(files, key=k)

它给出了这样的输出:

代码语言:javascript
复制
['u11-Phrase 099.wav', 'u11-Phrase 1000.wav', 'u11-Phrase 100.wav']
['u11-Phrase 099.wav', 'u11-Phrase 100.wav', 'u11-Phrase 1000.wav']

k函数将数字序列上的文件名拆分,(更重要的是)将这些序列转换为整数:

代码语言:javascript
复制
>>> k('u11-Phrase 099.wav')
['u', 11, '-Phrase ', 99, '.wav']

然后,我们使用Python知道如何排序列表的事实--通过逐个比较每个元素来对列表进行排序。最终的结果是

代码语言:javascript
复制
>>> k('u11-Phrase 99.wav') < k('u11-Phrase 100.wav')
True

鉴于

代码语言:javascript
复制
>>> 'u11-Phrase 99.wav' < 'u11-Phrase 100.wav'
False

你已经发现了。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1940056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档