python - 根据另一个列表的排序方式对列表进行排序。蟒蛇 3
问题描述
一段时间以来,我一直在努力根据 Python 3 中的先前排序列表对列表进行排序,尽管我会向你们寻求帮助。
好的,所以我有一个清单:
list = ['A103', 'A101', 'C101', 'B101']
此列表使用以下代码按字母和数字方式排序:
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
list_sorted = sorted(list, key=alphanum_key)
新列表 list_sorted 如下所示['A101', 'A103', 'B101', 'C101']
:
现在到了棘手的部分,我有另一个列表,其值对应于“列表”中的值,需要以相同的方式排序。
例子:
list = ['A103', 'A101', 'C101', 'B101']
rad = ['£', '$', '€', '@']
list_sorted =['A101', 'A103', 'B101', 'C101']
rad = ['$', '£', '@', '€'].
非常感谢所有帮助,谢谢!
解决方案
不要尝试排序两次。相反,在排序之前将两个列表压缩在一起,并且只对第一个项目进行排序。
import re
list = ['A103', 'A101', 'C101', 'B101']
rad = ['£', '$', '€', '@']
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key[0])]
# only consider first item ----^
list_sorted = sorted(zip(list, rad), key=alphanum_key)
# zip both lists ---^
print(list_sorted) # [('A101', '$'), ('A103', '£'), ('B101', '@'), ('C101', '€')]
这可以很容易地通过拆包推广到两个以上的列表。
list = ['A103', 'A101', 'B101']
rad = ['£', '$', '@']
more = [1, 2, 3]
lists = list, rad, more
...
list_sorted = sorted(zip(*lists), key=alphanum_key)
print(list_sorted) # [('A101', '$', 2), ('A103', '£', 1), ('B101', '@', 3)]
推荐阅读
- r - 将CSV转换为R语言中的矢量形式
- ios - AWSMobileClient iOS SDK - 获取 AWS 凭证时无法获取身份 ID
- c# - 删除表后没有创建表(CodeFirst)
- python - 如何过滤忽略空列的 Pandas 数据框
- web-applications - “添加到主屏幕”的标准
- java - RxJava onError 回调没有捕获到 InterruptedException?
- c - C - 如果达到 EOF,为什么 fread() 有两种可能的行为?
- html - Cuelinks 小部件的一半被隐藏在 WordPress 网站上
- javascript - 如何继续代码以允许我单击图像并显示包含更多信息的单独页面
- java - 如何在 selenium webdriver 中获取标签文本的值