我有一些项目列表,我想按其子列表进行排序。我想这样做,除了排序之外,不修改原始列表。
该列表可能如下所示:
[
("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/