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

2024-05-06 18:26:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我希望它可以这样列出:

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

我尝试过不同的排序和lambda排序,但我不能让它按数字排序


Tags: 排序数字coordsd154bluea154bluee155blueb150brownd155blue
2条回答

您可以使用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

然后将其用作keylist.sort参数:

coords = ['`154blue', '`155blue', 'a154blue', 'a155blue', 'b154blue', 'b155blue', 'c154blue', 'c155blue', 'd154blue', 'd155blue', 'e155blue', '`156brown', 'a156brown', 'a158brown', 'b150brown']
coords.sort(key=lambda s: int(''.join(c for c in s if c.isdigit())))
print(coords)
# ['b150brown', '`154blue', 'a154blue', 'b154blue', 'c154blue', 'd154blue', '`155blue', 'a155blue', 'b155blue', 'c155blue', 'd155blue', 'e155blue', '`156brown', 'a156brown', 'a158brown']

此外,当字符串具有相同的编号时,可以通过按字典顺序对字符串进行排序来打破联系,如Shash Sinha所示:

coords = ['`154blue', '`155blue', 'a154blue', 'a155blue', 'b154blue', 'b155blue', 'c154blue', 'c155blue', 'd154blue', 'd155blue', 'e155blue', '`156brown', 'a156brown', 'a158brown', 'b150brown']
coords.sort(key=lambda s: (int(''.join(c for c in s if c.isdigit())), s))
print(coords)
# ['b150brown', '`154blue', 'a154blue', 'b154blue', 'c154blue', 'd154blue', '`155blue', 'a155blue', 'b155blue', 'c155blue', 'd155blue', 'e155blue', '`156brown', 'a156brown', 'a158brown']

您可以使用正则表达式获取数字,然后根据基础字符串进行排序,例如,如果有两个坐标具有相同的数字:

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', 'a154blue', 'b154blue', 'c154blue', 'd154blue', '`155blue', 'a155blue', 'b155blue', 'c155blue', 'd155blue', 'e155blue', '`156brown', 'a156brown', 'a158brown']

相关问题 更多 >