按键对列表中的记录进行排序

时间:2020-02-01 19:52:49

标签: python

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

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条记录,但它们始终不会按名称进行排序,而且我无法手动对文本文件进行排序。

1 个答案:

答案 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')]