【问题标题】:how to sort the elements in a list in numerical order and not alphabetical如何按数字顺序而不是字母顺序对列表中的元素进行排序
【发布时间】:2022-01-26 23:50:45
【问题描述】:

我有一个列表,其中包含带有数字的句子,我想按数字而不是字母顺序排序。但是当我使用排序功能时,它会按字母而不是数字对元素进行排序,我该如何解决这个问题?

num = ['ryan has 8 apples','charles has 16 bananas','mylah has 3 watermelons']
num.sort()
print(num)

output:
['charles.....','mylah.....','ryan......']

如您所见,它是按字母顺序排序的,但这不是我的预期输出

点代表句子的其余部分

expected result:

['mylah has 3 watermelons','ryan has 8 apples','charles has 16 bananas']

这是预期的输出,其中元素按数字而非字母顺序排序

【问题讨论】:

  • 我不明白为什么你会期望 Python 会神奇地猜测你想使用字符串中某处的数字来对它们进行排序。阅读例如docs.python.org/3/howto/sorting.html 寻求指导。
  • 这似乎有点苛刻 :( OP 并没有说 Python 做错了什么,他们只是在询问哪些 Python 功能会产生他们正在寻找的解决方案。
  • 字符串中只有1个数字还是多个?

标签: python sorting


【解决方案1】:

您需要传入一个键来对它们进行排序,该键将字符串拆分并将数字解析为要排序的数字,如果您希望具有相同数字的那些,您也可以按字母顺序排序。

sorted(num, key=lambda x: (int(x.split()[2]), x))

num.sort(key=lambda x: (int(x.split()[2]), x))

【讨论】:

    【解决方案2】:

    您需要使用key=sort 知道您要为每个元素分配哪个值进行排序。

    如果字符串总是这样结构化,您可以使用:

    num = ['ryan has 8 apples','charles has 16 bananas','mylah has 3 watermelons']
    num.sort(key=lambda x: int(x.split(' ')[2]))
    print(num)
    

    如果它们更复杂,请查看正则表达式。

    【讨论】:

      【解决方案3】:

      到目前为止,解决方案专注于特定于字符串结构的解决方案,但会因字符串结构略有不同而失败。如果我们只提取字符串的数字部分,然后转换为int,我们将得到一个可以传递给排序函数的关键参数的值:

      num.sort(
          key=lambda s: int(''.join(c for c in s if c.isdigit()))
      )
      

      key 参数可让您指定数据的某些替代方面以进行排序,在这种情况下,是 lambda 函数提供的值。

      【讨论】:

      • 如果结构不同,那么您的答案也同样容易受到影响,即“乔有 3 个苹果和 4 个橙子”
      • 是的,完全正确!在某些时候,不可能解决所有可能的变化,您必须确定问题的领域是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2015-04-04
      相关资源
      最近更新 更多