【问题标题】:Sorting in python - how to sort a list containing alphanumeric values?在 python 中排序 - 如何对包含字母数字值的列表进行排序?
【发布时间】:2013-10-22 09:20:45
【问题描述】:

我有一个包含以下详细信息的列表:

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]

现在,我想对这个列表进行排序,使值按以下顺序排列:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"]

只是做list1.sort() 显然不能给出正确的答案—— 它给出了:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"]

我假设这是因为 python 直接将所有这些视为字符串。 但是,我想根据它们的数值 FIRST 对它们进行排序,然后是数字后面的字符。

我该怎么做?

非常感谢:)

【问题讨论】:

标签: python sorting python-2.7 python-3.x


【解决方案1】:

你想使用natural sort:

import re

_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split(_nsre, s)]   

示例用法:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]
>>> list1.sort(key=natural_sort_key)
>>> list1
['1', '2C', '36', '100A', '132', '302F', '342B']

此功能通过将元素拆分为列表来分离数字并将它们作为整数而不是字符串进行比较:

>>> natural_sort_key("100A")
['', 100, 'a']
>>> natural_sort_key("342B")
['', 342, 'b']

请注意,这仅适用于 Python3,前提是您始终将整数与整数以及字符串与字符串进行比较,否则会出现 TypeError: unorderable types 异常。

【讨论】:

  • 请注意,对于 Python 3,所有项目都必须具有相似的结构。 ['a1', '2b'] 将失败并返回 TypeError
  • @StevenRumbalski:啊,我忘了,谢谢。我会提到它。
【解决方案2】:

好吧,您必须先找到一种将字符串转换为数字的方法。例如

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

然后你将它用作排序键:

list1.sort(key=convert)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多