【问题标题】:How to sort a list of lists by one element ascending and another descending如何按一个元素升序和另一个降序对列表列表进行排序
【发布时间】:2018-05-10 19:44:25
【问题描述】:

我需要按数字降序排列列表中的列表。如果数字相同,我必须按字母顺序(递增)排序。

例如,如果我有以下列表:

mylist=[['a', 5], ['l', 2], ['u', 1], ['t', 1], ['q', 1], ['o', 1], ['e', 1]]

输出必须是这样的:

[['a', 5], ['l', 2], ['e', 1], ['o', 1], ['q', 1], ['t', 1], ['u', 1]]

我已经搜索过这个,但我只能找到如何订购列表。这里的问题是,当数字相同时,我必须按字母顺序排列。所以顺序首先是数字(我已经达到了),然后当数字相同时我必须排序但字母表。​​

【问题讨论】:

  • 您是否搜索过如何对列表进行排序?
  • 为什么['y', 0] 出现在['z', 0] 之后?我不明白你希望这个列表如何排序。
  • 您是在问如何仅对列表的 部分 (第二个元素 = 1 的部分)进行排序,其余部分保持不变?
  • 我认为将其转换为字典格式会更容易实现和思考。字典方法对这个用例有意义吗?
  • 我搜索过这个,但是我只能找到如何排序列表,但这里的问题是我必须在数字相同的情况下按字母排序。所以顺序首先是数字(我已经达到了),然后当数字相同时我必须按字母顺序排序。

标签: python list sorting


【解决方案1】:

如果我理解正确,您想按第二个元素(数字)降序和第一个元素(字母)按字母顺序升序排序。

这应该会得到你要找的东西:

mylist = list=[['a', 5], ['l', 2], ['u', 1], ['t', 1], ['q', 1], ['o', 1], ['e', 1]]
sorted_list = sorted(mylist, key = lambda x:(-x[1], x[0]))
print(sorted_list)
#[['a', 5], ['l', 2], ['e', 1], ['o', 1], ['q', 1], ['t', 1], ['u', 1]]

我们使用sortedkey 参数来定义如何对列表进行排序。在这种情况下,我们传入一个 lambda 函数 lambda x: (-x[1], x[0]) 作为键函数。这里的“技巧”是我们传入x[1] 的负数(数字的负数),以便它按数字降序排序。元组x[0] 的第二个元素是字符,它将用于打破具有相同数值的列表元素的关系。

【讨论】:

  • @JamesPaul 一个很好的解释是here
  • 在条件相同但字母顺序相反的情况下如何订购?
  • 我能想到的方法有两种。 1)如果你想按数字和字母降序排序:将reverse=True传递给sorted()并删除负号:sorted(mylist, key = lambda x:(x[1], x[0]), reverse=True)。 2) 另一种方法是使用ord 将字母转换为有序数字表示并将其取反:sorted(mylist, key = lambda x:(-x[1], -ord(x[0])))
【解决方案2】:

您可以使用 key 仅关键字参数来更改 list.sort 评估列表中每个元素的方式。在这种情况下,您希望它评估每个子列表的第二个元素,或 sublist[1]

# don't use `list` as a variable name, it shadows the builtin
lst.sort(key=lambda sublst: sublst[1])

或使用operator.itemgetter:

from operator import itemgetter

lst.sort(key=itemgetter(1))

【讨论】:

  • 问题还要求按字母顺序排列结果,但给定的预期输出没有这样做,所以我忽略了这部分要求
【解决方案3】:

如果您想变得更复杂,您可以定义一个以您想要的方式定义“

对于这个简单的例子,这似乎有点过头了。

class Foo(list):
    def __lt__(self, other):
        return self[1] > other[1] or (self[1] == other[1] and self[0] < other[0])

sorted(l, key=Foo)

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 2015-03-31
    • 2021-01-23
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多