按列表的属性对列表进行排序[重复]

Posted

技术标签:

【中文标题】按列表的属性对列表进行排序[重复]【英文标题】:Sort list by attribute of list [duplicate] 【发布时间】:2015-09-21 02:59:19 【问题描述】:

我知道有几篇关于各种 python 列表的帖子,但我尝试了很多东西,但没有完成我想要的。

我的代码:

    list = []
    things = re.findall('<a class="th tooltip" data-rel=.*? href="(.*?)".*?>   <img src="(.*?)"  .*?', content, re.DOTALL)
for url, image, name in things:
    list.append('url': url, 'image': image, 'name': name)

现在我想按名称对这个列表进行排序。我发现了几篇声明使用list.sort(key=) 的帖子,但我不知道我应该使用什么作为密钥。我尝试的一切都导致KeyError

如果我要复制已解决的帖子,我很抱歉,但我找不到合适的解决方案。

提前致谢。

【问题讨论】:

使用 lambda 函数将列表项 i 映射到 i['name'],如下所示:key=lambda i: i['name'] 最好是key=operator.itemgetter('name') @bereal: 更好:) @bereal 使用 operator.attrgetter('name') 否则它不适用于不可下标的对象 @Patrick attrgetter 不能用于 dicts,这就是我们在这种情况下要处理的问题。 【参考方案1】:

使用 lambda 表达式,lambda 表达式将字典作为参数,然后您可以从字典中返回 name 元素 -

lst.sort(key=lambda x: x['name'])

另外,请不要使用list作为变量名,它会覆盖内置的list函数,这可能会导致尝试使用list(..)函数时出现问题。

【讨论】:

哇,谢谢.. 我发现我在错误的地方排序,因此我得到了两个子列表作为输出排序。 THX 使用key=attrgetter('name') 以获得更好的性能(从运营商导入 attrgetter) attrgetter 在这个中不起作用,因为我们正在使用列表中的字典。但是如果你打算将 getattr(x, 'name')x.name 作为 key ,那么 attrgetter 就可以了。但是不要真的推荐尝试优化,除非你知道这部分是程序的瓶颈。

以上是关于按列表的属性对列表进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按字符串属性C#对对象列表进行排序[重复]

按属性对对象列表进行排序[重复]

按特定属性对类列表进行排序[重复]

C# LINQ 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]

Python:按“列”对列表进行排序[重复]

按特定键的降序对字典列表进行排序[重复]