python - 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)
解决方案
您可以使用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']
推荐阅读
- netlogo - 使用 Netlogo 实现 LpSolve 的示例
- r - 使用 R 在 EC2 AWS 服务器上出现 429 Unknown Error 我该怎么办?
- c# - 多个 CustomSort 等价于 Multiple SortDescription
- android - 在 Flutter Firebase 存储中通过 Url 获取引用并删除在运行旧 Android 版本的手机中给出“位置不能为空错误”
- python - 以选定的频率写入 csv 文件
- c++ - C++ 使用 ShellExecute 在新窗口中打开 url
- java - For循环覆盖数组一旦完成
- javascript - 如何在 chrome 扩展中添加“读取和更改您访问的网站上的所有数据”权限?
- mysql - 如何获取 MySQL 中的最新值?
- ios - 在隐式展开 Optional 时意外发现 nil