【问题标题】:How to sort nested lists when first elements match?当第一个元素匹配时如何对嵌套列表进行排序?
【发布时间】:2019-07-20 17:49:57
【问题描述】:

我有一个嵌套列表,它根据每个子列表的第一个元素进行排序:

t = [['2', '5'], ['8', '10'], ['8', '2'], ['8', '5'], ['9', '0']]

我现在怎样才能在不影响其他子列表的情况下,按下一个元素对以相同元素开头的子列表进行排序?

例如对 t[1]、t[2] 和 t[3] 进行排序,同时保持其他子列表的顺序:

sort_by_all(t) 
>> [['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]

我的逻辑是首先找到所有以相同元素开头的子列表,按它们的第二个元素对它们进行排序,然后以某种方式将它们放回原始列表中。

【问题讨论】:

  • 只是sorted(t)。默认的排序方式是按字典顺序排列的。请注意,如果值大于9'10' 将在'1''2' 之间排序
  • 是的,如前所述,假设值介于 '0''9' 之间。
  • 谢谢,docs 中没有此信息。

标签: python algorithm sorting


【解决方案1】:

sortedlist.sort 都可以按字典顺序排序。换句话说,您可以传入一个返回序列的键。在这种情况下,您需要先将任何值转换为整数。

t = [['2', '5'], ['8', '10'], ['8', '2'], ['8', '5'], ['9', '0']]
# Create new list
print(sorted(t, key=lambda seq: (int(seq[0]), int(seq[1]))))
# Or, sort in place
t.sort(key=lambda seq: (int(seq[0]), int(seq[1])))
print(t)

# Output
[['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]
[['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]

如果您希望它适用于每个子列表包含两个以上元素的列表,请将键替换为:

lambda seq: [int(i) for i in seq]

【讨论】:

    【解决方案2】:

    我的逻辑是首先找到所有以相同元素开头的子列表,按它们的第二个元素对它们进行排序,然后以某种方式将它们放回原始列表中。

    列表和元组的默认顺序是按字典顺序。这意味着 Python 将首先比较列表/元组的第一个元素,如果它们匹配,它将前进到下一个元素,等等。

    这里的一个问题是'10''1''2' 之间排序。鉴于字符串是整数的表示,我们可以通过首先将元素映射到 int 构造函数来解决这个问题。

    因此,您可以在列表上调用t.sort(..),如果您想构建一个新列表,则可以调用sorted(t)。例如:

    >>> t = [['2', '5'], ['8', '10'], ['8', '2'], ['8', '5'], ['9', '0']]
    >>> t.sort(key=lambda l: list(map(int, l)))
    >>> t
    [['2', '5'], ['8', '2'], ['8', '5'], ['8', '10'], ['9', '0']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多