Python 排序 - 半忽略大小写(a、aa、A、AA、b、bb、B、BB...)

标签 python sorting

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

['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)

最佳答案

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

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

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

>>> 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']

关于Python 排序 - 半忽略大小写(a、aa、A、AA、b、bb、B、BB...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50872762/

相关文章:

python - Django 模型覆盖仅在我保存两次时才有效

python - 删除 First_Name 行中的重复项,但附加 Last_Name 的集合

python - 如何显示有关错误的信息?

python - 为什么在连接到使用 supervisord 运行的进程时 stdout 不刷新?

c - 相对于另一个数组重新排列一个数组

python - 如何在 Tornado 中以最少的阻塞散列密码?

algorithm - 外部排序阶段的组合复杂度

c++ - 对具有私有(private)变量的类 vector 使用排序

swift - 按键排序词典

java - Java中如何在两个不同的地方访问同一个文件