我可以在Python中按第二个参数对列表排序吗?

我可以在Python中按第二个参数对列表排序吗?,python,Python,我有一个外部.txt文件,如下所示: Year of birth (yyyy); id; First name; Second name; ... Year of birth (yyyy); id; First name; Second name; 我可以创建一个新列表,按照bbbbpart对所有元素进行排序吗 我尝试通过拆分所有元素然后对其进行排序来实现这一点,但像这样,我丢失了连接到该id的其他元素 文本文件中项目的示例字符串: sample = """1998; 1; Jim; Smit

我有一个外部.txt文件,如下所示:

Year of birth (yyyy); id; First name; Second name;
...
Year of birth (yyyy); id; First name; Second name;
我可以创建一个新列表,按照
bbbb
part对所有元素进行排序吗


我尝试通过拆分所有元素然后对其进行排序来实现这一点,但像这样,我丢失了连接到该
id

的其他元素

文本文件中项目的示例字符串:

sample = """1998; 1; Jim; Smith;
2001; 2; Andrea; Johnson;
1995; 3; Tom; Jones;"""
我们将通过拆分字符串、拆分行并附加到主数组来创建多维数组(列表列表列表)

matrix = list()
for record in sample.split('\n'):
    line = [i.strip() for i in record.split(';') if len(i) > 0]
    matrix .append(line)
我们的矩阵:

[
['1998', '1', 'Jim', 'Smith'],
['2001', '2', 'Andrea', 'Johnson'],
['1995', '3', 'Tom', 'Jones']
]
要排序,可以使用列表的内置方法并实现lambda函数来选择要排序的列。注意:由于Python中的索引是从零开始的,所以必须考虑到这一点。例如,x[1]表示第二项,或
id
列:

排序1:按ID降序排列

matrix.sort(key=lambda x: x[1], reverse=True)
产出1:

[
['1995', '3', 'Tom', 'Jones'],
['2001', '2', 'Andrea', 'Johnson'],
['1998', '1', 'Jim', 'Smith']
]
排序2:出生年份降序(从最小到最大)

产出2:

[
['2001', '2', 'Andrea', 'Johnson'],
['1998', '1', 'Jim', 'Smith'],
['1995', '3', 'Tom', 'Jones']
]

有很多方法可以使用内置函数和模块,或者其他答案中提到的第三方库(如
pandas

使用简单的内置函数,通过将文件对象传递给函数,可以从文件创建排序列表:

with open(filename) as file_object:
    lines = sorted(file_object)
这是因为
sorted
接受任何序列或iterable对象。文件对象是可编辑的,一次生成一行

这将从每行的第一个字符开始按字母顺序排序,然后比较第二个字符,以此类推

由于要按分号之间的第二个字符串排序,因此需要提取该字符串并按其排序。有很多方法可以做到这一点

sorted
函数采用
参数。您应该在这里传递一个函数,该函数将为每一行调用,并返回将该行与其他行进行比较的条件

例如,我们可以将该行拆分为单独字符串的列表:

>>> line = '1998;1234;Jim;Smith;'
>>> line.split(';')
['1998', '1234', 'Jim', 'Smith']
然后我们要比较列表中的第二个值(我们从
0
开始计数,因此第二个值是
[1]
):

创建一个执行此操作的函数,然后我们可以将其作为
键传递给
排序的

def get_id(line):
    return line.split(';')[1]

with open(filename) as file_object:
    lines = sorted(file_object, key=get_id)
虽然您可能希望对
进行更多处理,以便每行都有一个值列表。Python有一个用于处理分隔值的内置模块(您使用的是分号):


在这种情况下,我们可以使用,而不必编写
get_id
,因为
csv
模块已经为我们完成了所有的拆分,我们只需要一个可以获取行中第二项的函数。

也许您可以指定BBBBBB部分是什么,您的示例中没有列出它。请发布输入文件示例、您尝试过的代码和预期输出的最小示例。绝对可以按任何要求的顺序对列表进行排序编写函数从给定字符串返回日期部分,并将其作为“key”参数传递给“sort”。
bbbbbb
id
?对于这样一个简单的问题,Numpy和pandas是非常繁重的模块。@PeterWood我同意它们是繁重的包,但它们是也是最常用的方法之一。所以人们投了反对票,因为我用这个方法解决了这个问题。这就是为什么stackoverflow是bs。彼得:你会怎么解决呢?就像我在对原始问题的评论中所说的。列表1是无效的syntax@PeterWood谢谢你提醒我,我修好了。我知道你比我有多年的经验。有什么更好的解决办法呢。
>>> line = '1998;1234;Jim;Smith;'
>>> line.split(';')
['1998', '1234', 'Jim', 'Smith']
>>> line.split(';')[1]
'1234'
def get_id(line):
    return line.split(';')[1]

with open(filename) as file_object:
    lines = sorted(file_object, key=get_id)
import csv
from operator import itemgetter

with open(filename) as file_object:
    reader = csv.reader(file_object, delimiter=';')
    rows = sorted(reader, key=itemgetter(1))