首页 > 解决方案 > Python 排序 - 半忽略大小写(a、aa、A、AA、b、bb、B、BB ......)

问题描述

如何对列表进行排序以结束:

['a', 'aa', 'aaa', 'A', 'AA', 'AAA', 'b', 'bb', 'bbb', 'B', 'BB', 'BBB']

为方便起见,假设它的洗牌版本:

['bb', 'a', 'B', 'BB', 'AAA', 'BBB', 'b', 'aa', 'aaa', 'A', 'AA', 'bbb']

我尝试通过忽略大小写进行排序:

l = sorted(l, key=lambda x: x.lower())

这导致['a', 'A', 'aa', 'AA', 'aaa', 'AAA']


从下面的答案中,混合情况有两种解决方案,我不确定哪个更好。

L = ['ABC1', 'abc1', 'ABC2', 'abc2', 'Abc']
l = sorted(L, key=lambda x: "".join([y.lower() + y.swapcase() for y in x]))
print(l)
l = sorted(L, key=lambda x: [(c.lower(), c.isupper()) for c in x])
print(l)

标签: pythonsorting

解决方案


您可以使用sorted()自定义键功能:

>>> L = ['bb', 'a', 'B', 'BB', 'AAA', 'BBB', 'b', 'aa', 'aaa', 'A', 'AA', 'bbb']
>>> sorted(L, key=lambda x: (x[0].lower(), x[0].isupper(), len(x)))
['a', 'aa', 'aaa', 'A', 'AA', 'AAA', 'b', 'bb', 'bbb', 'B', 'BB', 'BBB']

这是通过首先比较每个元素的第一个小写字符,然后是元素的大小写,最后是它的长度来实现的。

PS要处理混合大小写和混合字符元素,您需要比较单个字符的元组,例如:

>>> L = ['ab', 'aA', 'bb', 'a', 'B', 'BB', 'b', 'aa', 'A', 'AA']
>>> sorted(L, key=lambda x: [(c.lower(), c.isupper()) for c in x])
['a', 'aa', 'aA', 'ab', 'A', 'AA', 'b', 'bb', 'B', 'BB']

推荐阅读