首页 > 解决方案 > 按键对列表中的记录进行排序

问题描述

我正在尝试使用他们的“键”(这是他们的名字)对列表中的记录进行排序。记录格式如下:

查尔斯 2 4 达拉斯 TX

里克 6 9 奥斯汀 TX

鲍勃 9 0 凯勒 TX

如何仅按名字对这些记录进行排序?到目前为止,我的代码是:

list_of_records = []
for line in my_file:
   list_of_records.append(line)

我正在读取的文件仅包含 3 条记录,但它们始终不会按名称排序,我无法手动对文本文件进行排序。

标签: python

解决方案


您可以使用keyPython内置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')]

推荐阅读