<p>请注意,Python已经对元组进行了自然排序,首先对第一个元素进行排序,然后对第二个元素进行排序,等等。这意味着如果我们可以创建一个反映元素适当排名的元组,那么我们可以简单地使用该元组作为键进行排序</p>
<p>要将排序模式转换为元组,请将“V”的存在视为负无穷大,否则使用数字</p>
<p>最后,我们可以使用Python的便利性,如<code>zip</code>和<code>re</code>来减少代码行</p>
<pre class="lang-py prettyprint-override"><code>import re
from math import inf
def sorted_tuples(string_list):
def rank(chunk):
if 'V' in chunk:
return -inf
return int(re.findall(r"\d+", chunk)[0])
items = [(word, word.split('-')) for (word,) in string_list]
keys = [(word, rank(chunks[1]), rank(chunks[2])) for (word, chunks) in items]
keys.sort(key=lambda x: (x[1], x[2]))
return list(zip(*keys))[0]
print(sorted_tuples([
('site-nfv01-swsto01V',),
('site-nfv01-swsto01',),
('site-nfv01-swsto02',),
('site-nfv02-swsto01V',),
('site-nfv02-swsto01',) ,
('site-nfv02-swsto02',)]))
# Outputs:
# ('site-nfv01-swsto01V',
# 'site-nfv01-swsto01',
# 'site-nfv01-swsto02',
# 'site-nfv02-swsto01V',
# 'site-nfv02-swsto01',
# 'site-nfv02-swsto02'
# )
</code></pre>
<p>或者,对于一行(不要这样做!):</p>
<pre class="lang-py prettyprint-override"><code>lambda string_list: list(zip(*sorted([(word, list(map(lambda x: -inf \
if 'V' in x else int(re.findall(r"\d+", x)[0]), word.split('-') \
[1:]))) for (word,) in string_list], key=lambda x: x[1])))[0]
</code></pre>