小能豆

按两个字段对 Python 列表进行排序

javascript

我有以下根据排序的 csv 创建的列表

list1 = sorted(csv1, key=operator.itemgetter(1))

我实际上想按两个标准对列表进行排序:首先按字段 1 中的值,然后按字段 2 中的值。我该怎么做呢?


阅读 41

收藏
2024-07-18

共1个答案

小能豆

要按照两个标准对列表进行排序,你可以使用 Python 的 sorted() 函数,并提供一个用于排序的键函数,这个函数返回一个元组,元组中包含按照优先顺序排列的字段值。这里是如何按照字段 1 和字段 2 对列表进行排序的方法:

假设 csv1 是一个包含元组(或列表)的列表,每个元组至少有两个字段:

import operator

# 假设 csv1 是一个包含元组的列表,每个元组有两个字段
csv1 = [
    (1, 3),
    (2, 2),
    (1, 2),
    (2, 1),
    (3, 1),
    (1, 1)
]

# 使用 key 函数按字段 1 和字段 2 排序
list1 = sorted(csv1, key=lambda x: (x[0], x[1]))

print(list1)

在这个例子中:
- csv1 是一个包含元组(或列表)的列表,每个元素有两个字段。
- sorted() 使用一个 key 函数,这个函数返回一个元组 (x[0], x[1]),其中 x 表示 csv1 中的每个元素。
- 排序首先按照 x[0](字段 1)排序,然后按照 x[1](字段 2)排序。

这种方法确保 list1 首先按字段 1 中的值排序。如果两个元素在字段 1 中具有相同的值,则按字段 2 中的值进行排序。

使用 operator.itemgetter

如果你喜欢使用 operator.itemgetter 而不是 lambda 函数来定义 key:

list1 = sorted(csv1, key=operator.itemgetter(0, 1))

在这里,operator.itemgetter(0, 1)csv1 中的每个元组或列表中获取索引 0 和索引 1 处的元素,并且 sorted() 使用这些值作为排序键。

示例:使用 CSV 数据

如果 csv1 是通过 csv.reader 从实际 CSV 文件读取的数据,并且假设数据如下:

import csv
import operator

# 假设 CSV 数据(用实际的文件读取逻辑替换)
csv_data = [
    ['Alice', 25],
    ['Bob', 30],
    ['Alice', 30],
    ['Bob', 20],
    ['Carol', 35],
    ['Alice', 20]
]

# 按名称(字段 0)和年龄(字段 1)排序
sorted_data = sorted(csv_data, key=operator.itemgetter(0, 1))

print(sorted_data)

输出:

[['Alice', 20], ['Alice', 25], ['Alice', 30], ['Bob', 20], ['Bob', 30], ['Carol', 35]]

这种方法确保首先按名称(字段 0)字母顺序排序,然后按年龄(字段 1)数值顺序排序,实现了所需的两个标准排序。根据你的实际情况,调整 csv_data 中的 CSV 读取逻辑以适应你的用例。

2024-07-18