【问题标题】:python sort list of objects by length of a containing listpython按包含列表的长度对对象列表进行排序
【发布时间】:2014-08-27 06:11:50
【问题描述】:

我有一个类,它包含两个列表,一个 int 和一个字符串。看起来像这样

class Something:
    num = 0

    def __init__(self, clu, pro)
        self.clu = clu
        self.rep = []
        self.rep_dis = []
        self.pro = ""

现在我主要保留Something 对象的列表。

something_list = []
tmp_something = Something("this", "that")
tmp_something.rep.append("some")
tmp_something.rep_dis.append("thing")
something_list.append(tmp_something)

如何按对象列表rep 的长度对该列表进行排序?

编辑:代码段格式

【问题讨论】:

    标签: python list sorting object


    【解决方案1】:

    “如何按...对对象列表进行排序”的答案始终是“使用 sort 的 key 参数”。在这种情况下:

    something_list.sort(key=lambda x: len(x.rep))
    

    key 参数是为列表中的每个项目调用的函数,并且应该返回您想要排序的值。

    【讨论】:

    • 完美!必须添加 reverse=True 以满足我的要求,但按预期工作,非常感谢!
    • +1 这是一个我希望 Python 有一个函数组合运算符的实例:from operator import attrgetter as ag; something_list.sort(key=len ∘ ag('rep'))。让 Python 编写函数,而不是必须定义 lambda,效率会更高。
    • @chepner:怎样才能“更有效率”?
    • lambda 正文中的所有名称查找都被推迟到调用函数之前,因此每次都会查找len。如果解释器自己执行组合,则生成的函数对象可以执行一次查找。 (不过,这是一个不好的例子,因为理论上传递给len 的每个对象都可能有自己的__len__ 需要查找。像key=list.__len__ ∘ ag('rep') 这样的东西有更大的潜力,假设你可以保证项目@ 987654333@ 将返回一个list 对象。
    • @chepner:您可以通过将len 作为参数(lambda x, len=len:...)传递到本地命名空间中。但总的来说,这种优化与 Python 的动态纹理背道而驰。对于一般情况,它需要每次都查找名称,因为它的值可能会在调用之间发生变化。无论哪种方式,额外的名称查找都非常快。但就原始问题而言,这既不是这里也不是那里:-)。
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多