python排序结尾的数字字符串

时间:2010-11-30 20:10:12

标签: python string sorting natural-sort

最简单的方法是使用数字对字符串列表进行排序,其中一些数字有3个数字,有些数字有4个数字:

>>> list = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> list.sort()
>>> print list
['asdf111', 'asdf123', 'asdf1234', 'asdf124']

应该将1234一个放在最后。有一个简单的方法吗?

8 个答案:

答案 0 :(得分:11)

  

有一种简单的方法吗?

您可以使用natsort模块。

>>> from natsort import natsorted
>>> natsorted(['asdf123', 'asdf1234', 'asdf111', 'asdf124'])
['asdf111', 'asdf123', 'asdf124', 'asdf1234']

完全披露,我是该软件包的作者。

答案 1 :(得分:5)

  

有一种简单的方法吗?

没有

完全不清楚真正的规则是什么。 “有些有3位数,有些有4位”并不是一个非常精确或完整的规范。您的所有示例都在数字前面显示4个字母。这总是如此吗?

import re
key_pat = re.compile(r"^(\D+)(\d+)$")
def key(item):
    m = key_pat.match(item)
    return m.group(1), int(m.group(2))

key函数可能会执行您想要的操作。或者它可能太复杂了。或许这个模式真的是r"^(.*)(\d{3,4})$",或者这些规则可能更加模糊。

>>> data= ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> data.sort( key=key )
>>> data
['asdf111', 'asdf123', 'asdf124', 'asdf1234']

答案 2 :(得分:1)

问题在于,排序按字母顺序排列,因为它们是字符串。在移动到下一个字符之前比较每个字符序列。

>>> 'a1234' < 'a124'  <----- positionally '3' is less than '4' 
True
>>> 

您需要通过数字排序来获得所需的输出。

>>> x = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> y = [ int(t[4:]) for t in x]
>>> z = sorted(y)
>>> z
[111, 123, 124, 1234]
>>> l = ['asdf'+str(t) for t in z]
>>> l
['asdf111', 'asdf123', 'asdf124', 'asdf1234']
>>> 

答案 3 :(得分:1)

l = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
l.sort(cmp=lambda x,y:cmp(int(x[4:]), int(y[4:]))

答案 4 :(得分:1)

您需要一个关键功能。你愿意在最后指定3或4位数字,我觉得你希望它们在数字上进行比较。

sorted(list_, key=lambda s: (s[:-4], int(s[-4:])) if s[-4] in '0123456789' else (s[:-3], int(s[-3:]))) 

没有lambda和条件表达式

def key(s):
    if key[-4] in '0123456789':
         return (s[:-4], int(s[-4:]))
    else:
         return (s[:-3], int(s[-3:]))

sorted(list_, key=key)

这只是利用了元组按第一个元素排序,然后是第二个元素的事实。因为调用key函数来获取要比较的值,现在将比较键函数返回的元组来比较元素。例如,'asdfbad123'将与'asd7890'进行比较,('asdfbad', 123)('asd', 7890)进行比较。如果字符串的最后3个字符实际上不是数字,那么你将获得一个非常合适的ValueError,因为你传递的数据不符合它的设计规格。

答案 5 :(得分:1)

您可能描述的内容称为Natural Sort或人类排序。如果您使用的是Python,则可以从Ned's implementation借用。

自然分类的算法大致如下:

  • 将每个值拆分为按字母顺序排列的“块”和数字“块”
  • 按每个值的第一个块排序
    • 如果块是按字母顺序排列的,则按常规排序
    • 如果块是数字,则按表示的数值
    • 排序
  • 获取具有相同第一个块的值,并按第二个块
  • 对它们进行排序
  • 等等

答案 6 :(得分:0)

L.sort(key=lambda s:int(''.join(filter(str.isdigit,s[-4:]))))

答案 7 :(得分:0)

而不是自己拆分每一行,我要求python使用re.findall()为我做这些:

import re
import sys

def SortKey(line):
  result = []
  for part in re.findall(r'\D+|\d+', line):
    try:
      result.append(int(part, 10))
    except (TypeError, ValueError) as _:
      result.append(part)
  return result

print ''.join(sorted(sys.stdin.readlines(), key=SortKey)),