【问题标题】:Alphanumeric sorting in Python and negative numbersPython中的字母数字排序和负数
【发布时间】:2017-02-25 05:27:48
【问题描述】:

我有一个相当简单的列表(一个数字后跟一个句子),按正确的顺序排列:

-347 a negative number
-100 another negative number
-25 and again, a negative number
17 some text
25 foo bar
100 two same texts
100 two same texts (almost)
350 a positive number

每次添加新项目时,我都需要对该列表进行排序。

我搜索了 S.O.并找到了答案:

Sorting in python - how to sort a list containing alphanumeric values?

我使用的代码是怪异的,它是:

import re
def convert(str):
    return int("".join(re.findall("\d*", str)))

list1.sort(key=convert)

为了更好地解释我的问题,我将列表打乱并运行代码。

结果是:

17 some text
-25 and again, a negative number
25 foo bar
100 two same texts (almost)
100 two same texts
-100 another negative number
-347 a negative number
350 a positive number

出了什么问题?自然对负数进行排序的代码的精度是多少?

【问题讨论】:

  • '-' 不是数字,因此与 '\d' 不匹配。因此,您的模式匹配只会找到完整的数字。旁注:如果您的输入字符串是例如'1 this is line 00001',它将按您的键排序最后。 '' 匹配 '\d*',但 int('') 引发 ValueError
  • 你可以在运行前将正负分开,然后将它们粘上,使负的反转并在顶部。
  • 您可以将您的转换功能更改为return int(str.split()[0])

标签: python sorting


【解决方案1】:

Sort可以接受一个元组,所以先按数字排序,再按后面的文本

list_text = """-347 a negative number
-100 another negative number
-25 and again, a negative number
17 some text
25 foo bar
100 two same texts
100 two same texts (almost)
350 a positive number"""

list1 = list_text.split("\n")

list1.sort(key=lambda x: (int(x.split()[0]), x.split(" ",1)))

print("\n".join(list1))

【讨论】:

  • 为了避免第一次加入,您可以将 1 作为参数传递给 split - 它会限制拆分次数
  • @Keatinge 首先,谢谢;但我在 [list1 = list_text.split("\n")] 行出现错误:AttributeError: 'list' object has no attribute 'split'。我不明白为什么(我的Python技能不值一提)
  • @ThG 就用最后两行吧,其他的都是可运行的例子,大家可以运行测试一下
  • @Keatinge:它有效。现在我很尴尬:我有 2 个很好的答案,而且我已经“勾选”了 Murelnik 的答案。而且我不知道如何分享我对 S.O. 的赞美。无论如何,非常感谢。
【解决方案2】:

恕我直言,最简单的方法是将字符串拆分为单个单词,然后按转换为int的第一个单词排序:

list1.sort(key = lambda x : int(x.split(" ")[0]))

编辑:
作为 Keatinge,上述解决方案无法正确处理以相同数字开头的两个字符串。使用整个字符串作为辅助搜索词应该可以解决这个问题:

list1.sort(key = lambda x : (int(x.split(" ")[0]), x)

【讨论】:

  • 这不会处理两个以相同数字开头但包含不同文本的字符串
  • @Keatinge 好点!使用字符串本身作为辅助搜索词应该可以解决问题 - 请参阅我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多