<p><strong>选项1</strong><br/>
<em><code>natsort.natsorted</code></em><br/>
<a href="https://github.com/SethMMorton/natsort" rel="nofollow noreferrer">^{<cd2>}</a>模块在这里工作得很好-</p>
<pre><code>>>> from natsort import natsorted
>>> natsorted(['a1b','a100b','a2b','a99b'])
['a1b', 'a2b', 'a99b', 'a100b']
</code></pre>
<hr/>
<p><strong>选项2</strong><br/>
<em><code>sorted</code></em>+<em><code>re.search</code></em><br/>
对于<code>regex</code>,我建议定义一个调用<code>re.search</code>的函数来查找和提取数字,并进行一些检查,以确保在字符串中找不到模式时不会引发异常。你知道吗</p>
<pre><code>import re
def f(x):
m = re.search('\d+', x)
return int(m.group()) if m else x
</code></pre>
<p/>
<pre><code>>>> sorted(['a1b','a100b','a2b','a99b'], key=f)
['a1b', 'a2b', 'a99b', 'a100b']
</code></pre>
<p>如果你有一个预先存在的调用<code>list.sort</code>的列表,你可以获得一些速度增益。<code>list.sort</code>执行就地排序,比<code>sorted</code>快一点,因为它就地操作,不生成数据的副本。你知道吗</p>
<p>另外需要注意的是,这个基于regex的排序版本比<code>lambda</code>更健壮。捕捉和处理异常成为可能,并且您不受<code>lambda</code>的单行要求的约束。你知道吗</p>
<hr/>
<p><strong>性能</strong></p>
<pre><code>l = ['a1b','a100b','a2b','a99b'] * 10000
</code></pre>
<p/>
<pre><code>%timeit natsorted(l)
1 loop, best of 3: 437 ms per loop
%timeit sorted(l, key=f)
10 loops, best of 3: 92.4 ms per loop
</code></pre>
<p>请注意,实际计时因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地推广到任意结构的输入。你知道吗</p>