我正在尝试使用它们的“键”(这是它们的名称)对列表中的记录进行排序。 记录的格式为:
CHARLES 2 4 DALLAS TX
RICK 6 9 AUSTIN TX
BOB 9 0 KELLER TX
如何仅按姓氏对这些记录进行排序?到目前为止,我的代码是:
list_of_records = []
for line in my_file:
list_of_records.append(line)
我正在读取的文件仅包含3条记录,但它们始终不会按名称进行排序,而且我无法手动对文本文件进行排序。
答案 0 :(得分:3)
您可以将key
参数用于Python的builtin sorted
function。
假设您的记录是元组:
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')]