尝试对字母数字坐标进行排序

问题描述

我有一个坐标列表,我想按文本和符号之间的数字对它们进行排序。

coords = ['`154blue','`155blue','a154blue','a155blue','b154blue','b155blue','c154blue','c155blue','d154blue','d155blue','e155blue','`156brown','a156brown','a158brown','b150brown']

我希望这样列出它:

coords = ['b150brown','`154blue','a158brown']

我尝试了不同的排序和lambda排序,但是我无法通过数字来做到这一点。

解决方法

您可以使用正则表达式获取数字,并首先对其进行排序,然后根据基础字符串说出是否存在两个具有相同数字的坐标:

import re

coords = ['`154blue','`155blue','a154blue','a155blue','b154blue','b155blue','c154blue','c155blue','d154blue','d155blue','e155blue','`156brown','a156brown','a158brown','b150brown']
coords.sort(key=lambda c: (re.search(r'\d+',c).group(0),c))
print(coords)

输出:

['b150brown','`154blue','a158brown']
,

您可以使用c in '0123456789'c.isdigit过滤掉非数字字符:

>>> s = 'b150brown'
>>> ''.join(c for c in s if c.isdigit())
'150'
>>> int(''.join(c for c in s if c.isdigit()))
150

然后将其用作key的{​​{1}}参数:

list.sort

另外,您可以按照Shash Sinha的建议,通过按字母顺序对字符串进行排序来打破平局,如https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-aspnet-core-webapp所示:

coords = ['`154blue','b150brown']
coords.sort(key=lambda s: int(''.join(c for c in s if c.isdigit())))
print(coords)
# ['b150brown','a158brown']