python - 当嵌套列表具有不同长度或缺少元素时,如何对 python 中的嵌套列表进行排序?

标签 python arrays sorting

我有一些项目列表,我想按其子列表进行排序。我想这样做,除了排序之外,不修改原始列表。

该列表可能如下所示:

[
    ("item A", dataA, [("sort 1a", 0.37), ("sort 2a", 0.11)], dataB, dataC),
    (
        "item B",
        dataA,
        [
            ("sort 1b", 0.37),
            ("sort 2b", 0.66),
            ("sort 3b", 0.85),
            ("sort 4b", 0.63),
            ("sort 5b", 0.26),
        ],
        dataB,
        dataC,
    ),
    (
        "item C",
        dataA,
        [("sort1c", 0.37), ("sort 2c", 0.15), ("sort 3c", 0.60)],
        dataB,
        dataC,
    ),
    (
        "item D",
        dataA,
        [
            ("sort 1d", 0.37),
            ("sort 2d", 0.66),
            ("sort 3d", 0.85),
            ("sort 4d", 0.63),
            ("sort 5d", 0.8),
        ],
        dataB,
        dataC,
    ),
]

我想首先按“排序 1”后面的数字排序,然后(其中排序 1 相等)按“排序 2”(如果存在)排序,然后(其中排序 1 和排序 2 相等)按“排序”排序 3'(如果存在)等。

这将产生一个如下列表:

[
    ("item A", dataA, [("sort 1a", 0.37), ("sort 2a", 0.11)], dataB, dataC),
    (
        "item C",
        dataA,
        [("sort1c", 0.37), ("sort 2c", 0.15), ("sort 3c", 0.60)],
        dataB,
        dataC,
    ),
    (
        "item B",
        dataA,
        [
            ("sort 1b", 0.37),
            ("sort 2b", 0.66),
            ("sort 3b", 0.85),
            ("sort 4b", 0.63),
            ("sort 5b", 0.26),
        ],
        dataB,
        dataC,
    ),
    (
        "item D",
        dataA,
        [
            ("sort 1d", 0.37),
            ("sort 2d", 0.66),
            ("sort 3d", 0.85),
            ("sort 4d", 0.63),
            ("sort 5d", 0.8),
        ],
        dataB,
        dataC,
    ),
]

我尝试过一些方法,例如采用排序子列表的最大长度,然后递增 i并使用 key=lambda x: x[2][i][1] 进行排序直到i > length 。但它只会产生索引错误,因为较短的子列表上的索引失败。

我也尝试过使用 key=lambda x: (x[2][i][1] not in x, x.get(x[2][i][1], None)但 get 只适用于字典。

感谢帮助!

最佳答案

一种方法:

def extract_key(e):
    return [v for _, v in e[2]]

res = sorted(lst, key=extract_key)
print(res)

输出

[('item A', 10, [('sort 1a', 0.37), ('sort 2a', 0.11)], 15, 16),
 ('item C', 10, [('sort1c', 0.37), ('sort 2c', 0.15), ('sort 3c', 0.6)], 15, 16),
 ('item B', 10, [('sort 1b', 0.37), ('sort 2b', 0.66), ('sort 3b', 0.85), ('sort 4b', 0.63), ('sort 5b', 0.26)], 15, 16),
 ('item D', 10, [('sort 1d', 0.37), ('sort 2d', 0.66), ('sort 3d', 0.85), ('sort 4d', 0.63), ('sort 5d', 0.8)], 15, 16)]

此方法假设 sort* 项始终已排序并存在,即否:

('sort 1a', 0.37), ('sort 3a', 0.11)
('sort 2a', 0.37), ('sort 1a', 0.11)

关于python - 当嵌套列表具有不同长度或缺少元素时,如何对 python 中的嵌套列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73108868/

相关文章:

python - Re.match 在 python 中总是返回 None

.NET 转换隐式可转换类型的数组

javascript - 将图像数组从一个窗口传递到另一个窗口并在 javascript 中的新窗口中显示图像

c - 从 C 中的 fscanf() 初始化时数组值不一致

algorithm - 谁首先证明了所有基于比较的排序都是 Omega(n lg n)?

python - 使用 python 和 matplotlib,在两行之间填充未给出预期输出

python - 按仅与其中一组对应的值列对双分组 df 进行排序

c - 顺序行为中的 Readdir()

python:numpy数组的矩阵列表?

arrays - 计算两个排序数组之间的差异