我有项目列表,我想按其子列表排序.我希望这样做时不修改原始列表,而只进行排序.

列表可能如下所示:

[
    ("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,
    ),
]

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

我也try 过使用key=lambda x: (x[2][i][1] not in x, x.get(x[2][i][1], None),但只在字典上获得作品.

感谢您的帮助!

推荐答案

一种方法:

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

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

Output

[('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相关问答推荐

为什么图像结果翻转了90度?

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

使用regex分析具有特定字符的字符串(如果它们存在)

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

使用from_pandas将GeDataFrame转换为polars失败,ArrowType错误:未传递numpy. dype对象

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

在应用循环中间保存pandas DataFrame

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

如果条件为真,则Groupby.mean()

我从带有langchain的mongoDB中的vector serch获得一个空数组

为什么tkinter框架没有被隐藏?

运行总计基于多列pandas的分组和总和

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何在Python脚本中附加一个Google tab(已经打开)

如何在UserSerializer中添加显式字段?

转换为浮点,pandas字符串列,混合千和十进制分隔符

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

如何合并两个列表,并获得每个索引值最高的列表名称?

启动带有参数的Python NTFS会导致文件路径混乱