python - 指定对字符串列表进行排序的键
问题描述
我正在尝试按两个值对 python 中的字符串列表进行排序。我想出的是:
import operator
l = ['A1 B2', 'A2 B2', 'A1 B3', 'A2 B1', 'A1 B1']
sorted(l, key=operator.itemgetter(1, 4))
['A1 B1', 'A1 B2', 'A1 B3', 'A2 B1', 'A2 B2']
但是,键的位置是相对硬编码的,如果字符串更改为['AA1 BB2', 'AA2 BB2', 'AA1 BB3', 'AA2 BB1', 'AA1 BB1']
,它将不起作用。此外,这些数字也可以多于一位['A1 B202', 'A2 B101', 'A1 B200', 'A2 B100', 'A1 B201']
。
如何更优雅地按两位数对字符串列表进行排序?
解决方案
第三方模块有效吗?您可以使用natsort
拆分和自然排序的键:
>>> import natsort
>>> natsort.natsorted(l, key=str.split)
['AA1 BB1', 'AA1 BB2', 'AA1 BB3', 'AA2 BB1', 'AA2 BB2']
您可以natsort
使用pip
.
- 当有多个数字时应该工作
- 当每个字符串超过两个单词时也应该工作。
- 当数字不在字符串末尾时也应该工作
对于此处提供的示例,排序是自然完成的,而不是像其他答案一样按字典顺序完成,这些答案巧合地返回与自然排序相同的答案。
推荐阅读
- php - 关于 zip 流如何处理 php 中的大文件的问题
- python - Flask - Bad Request 浏览器发送了一个服务器无法理解的请求
- c++ - 使用带有 glm 的 2d 正交矩阵时遇到问题
- java - 如何在 Firebase 实时数据库中存储浮点列表?
- android - ViewPager setCurrentItem 未按预期工作
- spring - 在 Spring Cloud AWS Messaging 中将加密 SQS 与 KMS 集成
- c++ - 如何在不操纵原始内容的情况下将 std::bitset<8> 输出的类型更改为整数?
- javascript - 更改材质 Ui 中选定项目的文本颜色
- python - 通过有序值将 pandas 数据帧切片成簇
- c++ - 指定宽度时如何仅在文本下划线?