python排序最后带数字的字符串

什么是最简单的方法来排序字符串列表在末尾有一些数字有3位数,有些有4位数:
>>> list = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> list.sort()
>>> print list
['asdf111', 'asdf123', 'asdf1234', 'asdf124']
应该把1234一个放在最后。是否有捷径可寻?     
已邀请:
  是否有捷径可寻? 没有 完全不清楚真正的规则是什么。 “有些有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']
    
  是否有捷径可寻? 是 您可以使用natsort模块。
>>> from natsort import natsorted
>>> natsorted(['asdf123', 'asdf1234', 'asdf111', 'asdf124'])
['asdf111', 'asdf123', 'asdf124', 'asdf1234']
完全披露,我是包的作者。     
l = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
l.sort(cmp=lambda x,y:cmp(int(x[4:]), int(y[4:]))
    
问题是这里的排序是按字母顺序排列的,因为它们是字符串。在移动到下一个字符之前比较每个字符序列。
>>> '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']
>>> 
    
您可能描述的内容称为自然排序或人类排序。如果你正在使用Python,你可以借用Ned的实现。 自然排序的算法大致如下: 将每个值拆分为按字母顺序排列的“块”和数字“块” 按每个值的第一个块排序 如果块是按字母顺序排列的,请像往常一样对其进行排序 如果块是数字,则按表示的数值排序 获取具有相同第一个块的值,并按第二个块对它们进行排序 等等     
L.sort(key=lambda s:int(''.join(filter(str.isdigit,s[-4:]))))
    
你需要一个关键功能。你愿意在最后指定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,因为你传递的数据不符合它的设计规格。     
而不是自己拆分每一行,我要求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)),
    

要回复问题请先登录注册