【问题标题】: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="(.*?)" alt="(.*?)" .*?', 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,这就是我们在这种情况下要处理的问题。

标签: python python-2.7


【解决方案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 就可以了。但是不要真的推荐尝试优化,除非你知道这部分是程序的瓶颈。
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 2021-11-12
  • 2015-11-14
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多