python - 按键对列表中的记录进行排序
问题描述
我正在尝试使用他们的“键”(这是他们的名字)对列表中的记录进行排序。记录格式如下:
查尔斯 2 4 达拉斯 TX
里克 6 9 奥斯汀 TX
鲍勃 9 0 凯勒 TX
如何仅按名字对这些记录进行排序?到目前为止,我的代码是:
list_of_records = []
for line in my_file:
list_of_records.append(line)
我正在读取的文件仅包含 3 条记录,但它们始终不会按名称排序,我无法手动对文本文件进行排序。
解决方案
您可以使用key
Python内置sorted
函数的参数。
假设您的记录是元组:
records = [
("CHARLES", 2, 4, "DALLAS TX"),
("RICK", 6, 9, "AUSTIN TX"),
("BOB", 9, 0, "KELLER TX")
]
sorted(records, key=lambda rec: rec[0])
# Produces:
[('BOB', 9, 0, 'KELLER TX'),
('CHARLES', 2, 4, 'DALLAS TX'),
('RICK', 6, 9, 'AUSTIN TX')]
我的建议是使用collections.namedtuple
创建一个记录类,并尽早将任何文本转换为正确的类型(例如整数)。(为简单起见,下面的示例代码省略了到整数的转换。)
如果您的记录是字符串,您可以调用line.split(" ")
每个元素来生成列表。
my_file = [
"CHARLES 2 4 DALLAS TX",
"RICK 6 9 AUSTIN TX",
"BOB 9 0 KELLER TX",
]
Record = collections.namedtuple("Record", "name, i, j, city, state")
records = [Record(*line.split(" ")) for line in my_file]
sorted(records, key=lambda rec: rec.name)
# Result:
# [Record(name='BOB', i='9', j='0', city='KELLER', state='TX'),
# Record(name='CHARLES', i='2', j='4', city='DALLAS', state='TX'),
# Record(name='RICK', i='6', j='9', city='AUSTIN', state='TX')]
推荐阅读
- c++ - 错误:重新定义类,尽管使用了包含守卫
- javascript - 控制台显示意外标识符错误并且代码不运行
- html - 伪元素覆盖主类
- java - 无法在服务中使用 findViewById,使用了 LayoutInflater 但没有帮助,没有显示值
- postgresql - 将 '0' 转换为双精度,然后乘以 -1 将导致负零
- android - Firebase Crashlytics - java.lang.IllegalStateException:缺少 Crashlytics 构建 ID
- swiftui - SwiftUI 中的系统 UIBarButtonItem
- alexa - addElicitSlotDirective 的奇怪行为
- c++ - 我可以使用 std::string* argv 作为主函数参数吗?
- performance - 在 ISO-Prolog 中正确处理非正规浮点数