【问题标题】:Python: sort specific elements in a listPython:对列表中的特定元素进行排序
【发布时间】:2017-03-17 09:21:33
【问题描述】:

我有一个要排序的元素列表,但我不想对所有元素进行排序,只对具有特定状态的元素进行排序。例如,假设我有一个人员列表:

lst = [Mary, John, Anna, Peter, Laura, Lisa, Steve]

他们中的一些人有工作,比如说[Anna, Lisa, Steve]。我想按它们工作的小时数对它们进行排序(升序)并将它们移动到列表的开头,同时保持其余部分的顺序完全相同。所以假设他们工作的小时数如下:

Anna.job.hours   # 10
Lisa.job.hours   # 5
Steve.job.hours  # 8

部分排序后的列表如下所示:

[Lisa, Steve, Anna, Mary, John, Peter, Laura]

当然,我可以从原来的列表中创建两个新列表,对我想要排序的列表进行排序,然后再次将它们放在一起以实现我所追求的:

with_job = [person for person in lst if person.job]
without_job = [person for person in lst if not person.job]

with_job.sort(key=lambda p: p.job.hours)

lst = with_job + without_job

但我想知道是否有一种直接的 Pythonic 方式来做到这一点。

【问题讨论】:

  • 我发现你做 Pythonic 的方式已经足够了。您不需要第二个列表,但除此之外..

标签: python python-2.7 sorting


【解决方案1】:

为什么不:

lst.sort(key=lambda p: p.job.hours if p.job else 999)

【讨论】:

  • 这个解决方案是否可以为没有工作的人维持秩序?
  • 等等,现在我想起来了,这个解决方案不会把没有工作的人放在列表的开头,而不是按照预期的那样放在最后吗?
  • @dabadaba 不,因为减号-p.job.hours
  • @dabadaba,是的,您可以通过使用密钥对来避免哨兵:lst.sort(key=lambda p: (not p.job, p.job.hours if p.job else 0)) 将首先对有工作的人进行排序,然后对其他人进行排序,0 可以是任何常量值。
  • @dabadaba if 将排序键设为元组 如果设置了 p.job,则第一个元素为 False,如果未设置 p.job,则为 True,因此所有有工作的人首先排序,然后是没有工作的人工作。然后,第二个元素充当辅助键并按小时数排序,但仅在需要打破第一个元素的平局时进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2021-07-04
  • 2016-03-22
  • 2011-10-18
  • 1970-01-01
  • 2016-07-17
  • 2021-11-17
相关资源
最近更新 更多