Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“Python排序”;u11短语1000.wav“;“之前”;u11短语101.wav“;;我怎样才能克服这个问题?_Python_Sorting - Fatal编程技术网

“Python排序”;u11短语1000.wav“;“之前”;u11短语101.wav“;;我怎样才能克服这个问题?

“Python排序”;u11短语1000.wav“;“之前”;u11短语101.wav“;;我怎样才能克服这个问题?,python,sorting,Python,Sorting,我正在win32上运行python2.5(r25:51908,2006年9月19日,09:52:17)[MSC v.1310 32位(英特尔)] 当我问Python的时候 >>> "u11-Phrase 099.wav" < "u11-Phrase 1000.wav" True 所以我不想在glob创建字符串之后对其进行外科手术。不,我也不想更改文件夹中的原始文件名 有什么提示吗?您正在寻找 101.wav不小于1000.wav的原因是计算机(不仅仅是Python)按

我正在win32上运行python2.5(r25:51908,2006年9月19日,09:52:17)[MSC v.1310 32位(英特尔)]

当我问Python的时候

>>> "u11-Phrase 099.wav" <  "u11-Phrase 1000.wav"
True
所以我不想在glob创建字符串之后对其进行外科手术。不,我也不想更改文件夹中的原始文件名

有什么提示吗?

您正在寻找

101.wav不小于1000.wav的原因是计算机(不仅仅是Python)按字符对字符串进行排序,这两个字符串之间的第一个区别是第一个字符串有一个“1”,第二个字符串有一个“0”“1”不小于“0”,因此字符串会像您看到的那样进行比较


人们很自然地将这些字符串解析为它们的组成部分,并用数字而不是词汇来解释数字。我上面链接的代码将进行相同的解析。

您需要为每个文件名构造一个适当的排序键。像这样的东西可以满足您的需求:

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
>>k('u11-Phrase 99.wav')
鉴于

>>> 'u11-Phrase 99.wav' < 'u11-Phrase 100.wav'
False
>>“u11词组99.wav”<'u11词组100.wav'
假的

正如您已经发现的。

也称为自然排序:+1。酷链接,我正要回答这个问题。现在不用了,非常感谢。这正是我所期望的,我可以将其用于排序中的文件(files,key=k):打印文件…我想知道这种自然/人工排序是否会成为任何编程语言中任何标准库的一部分…@Emre,可能不会,因为很难找到普遍适用的东西。例如,输入的“u11”部分应该被视为“u”和整数11,就像它应该被视为3个字符的简单字符串一样。通常这是完全上下文敏感的。至少在Python中,编写自定义排序键函数太容易了,不需要麻烦将一个大小写作为标准库例程。@Emre:很高兴你喜欢它!内置的
排序
对于这些东西来说非常方便。顺便说一句,你应该给函数起一个比脚本中的
k
更好的名字:-)或者
natural\u sort\u key
或者类似的名字。
['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('u11-Phrase 099.wav')
['u', 11, '-Phrase ', 99, '.wav']
>>> k('u11-Phrase 99.wav') < k('u11-Phrase 100.wav')
True
>>> 'u11-Phrase 99.wav' < 'u11-Phrase 100.wav'
False