最简单的方法是使用数字对字符串列表进行排序,其中一些数字有3个数字,有些数字有4个数字:
>>> list = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> list.sort()
>>> print list
['asdf111', 'asdf123', 'asdf1234', 'asdf124']
应该将1234一个放在最后。有一个简单的方法吗?
答案 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)),