【发布时间】:2021-03-29 03:11:14
【问题描述】:
我查看了许多相关问题,但我没有找到专门处理以下问题的问题。我有一个列表列表,其中每个列表都包含元组。这些元组由两个具有id 属性的类实例组成。我只想对 outer 列表进行排序,以便对子列表进行排序,使子列表根据该子列表中所有元组的第一项的属性的最小值进行排序,并且其次是所有元组的第二项的属性的最小值。
这听起来比实际复杂,所以这里有一个例子:
from dataclasses import dataclass
@dataclass
class Char:
id: int
l = [
[(Char(1), Char(2)), (Char(2), Char(3))],
[(Char(4), Char(2)), (Char(5), Char(3))],
[(Char(0), Char(0))],
[(Char(-1), Char(1))],
[(Char(3), Char(-1))],
]
重申:每个子列表都包含包含两个Chars 的元组,它们都有一个id。这些总是顺序的:你可以看到第一个元组的第一项是 1,第二个元组的第一项是 2。这些子列表应该按第一项的最小值排序,然后是第二个的最小值元组项。
那么,预期的输出如下:
l = [
[(Char(-1), Char(1))],
[(Char(0), Char(0))],
[(Char(1), Char(2)), (Char(2), Char(3))],
[(Char(3), Char(-1))],
[(Char(4), Char(2)), (Char(5), Char(3))],
]
-1 是元组中所有第一项中的最小值,因此列表必须排在第一位。
以下方法有效,但我不确定是否有更好、更干燥/有效的方法来做到这一点:
l.sort(key=lambda sub: (min([w[0].id for w in sub]),
min([w[1].id for w in sub])))
【问题讨论】:
-
可能是
l.sort(key=lambda sub: (sub[0][0].id, sub[0][1].id))? -
术语注释:这些不是类的元组。它们是
Charinstances 的元组。这很重要,因为 Python 中的类是一等对象,您可以拥有一个类元组,例如(int, str)