我运行Python2.5 (r25:51908,2006年9月19日,09:52:17) MSC v.131032位(英特尔)在win 32上
当我问Python
>>> "u11-Phrase 099.wav" < "u11-Phrase 1000.wav"
True这很好。当我问
>>> "u11-Phrase 100.wav" < "u11-Phrase 1000.wav"
True这也很好。但当我问
>>> "u11-Phrase 101.wav" < "u11-Phrase 1000.wav"
False因此,根据Python,“U11-短语100.wav”出现在“U11-短语1000.wav”之前,而“U11-短语101.wav”出现在“U11-短语1000.wav”之后!这对我来说是个问题,因为我试图编写一个文件重命名程序,而这种排序破坏了功能。
我能做些什么来克服这个问题呢?我应该编写自己的cmp函数并测试边缘情况,还是有一个简单得多的快捷方式来给我所需的排序?
另一方面,如果我修改字符串,如
>>> "u11-Phrase 0101.wav" < "u11-Phrase 1000.wav"
True但是,这些字符串来自目录的文件列表,如:
files = glob.glob('*.wav')
files.sort()
for file in files:
...所以我宁愿不对弦做手术,因为它们是由glob创造的。不,我也不想更改文件夹中的原始文件名。
有什么暗示吗?
发布于 2009-12-21 13:23:39
你在找人类分类。
101.wav不小于1000.wav的原因是计算机(不仅仅是Python)按字符对字符串进行排序,这两个字符串之间的第一个区别是第一个字符串有'1‘,第二个字符串有'0’。'1‘是不小于'0',所以字符串比较,正如你已经看到的。
人们自然地将这些字符串解析成它们的组件,并对数字进行数值解释,而不是从词汇上解释。我链接到的代码将进行同样的解析。
发布于 2009-12-21 13:29:23
您需要为每个文件名构造一个适当的排序键。像这样的事情应该做你想做的事:
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)它给出了这样的输出:
['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函数将数字序列上的文件名拆分,(更重要的是)将这些序列转换为整数:
>>> k('u11-Phrase 099.wav')
['u', 11, '-Phrase ', 99, '.wav']然后,我们使用Python知道如何排序列表的事实--通过逐个比较每个元素来对列表进行排序。最终的结果是
>>> k('u11-Phrase 99.wav') < k('u11-Phrase 100.wav')
True鉴于
>>> 'u11-Phrase 99.wav' < 'u11-Phrase 100.wav'
False你已经发现了。
https://stackoverflow.com/questions/1940056
复制相似问题