files = ["1card.txt", "card.txt" , "3card.txt", "52card.txt", "badcard.txt"]
def nat_sort(s):
'''
provides a sort mechanism for strings that may or
may not lead with an integer
'''
for i, c in enumerate(s):
if not c.isdigit():
break
if not i:
return 0, s
else:
return int(s[:i]), s[i:]
files.sort(key=nat_sort)
And now files
is a sorted list:
['badcard.txt', 'card.txt', '1card.txt', '3card.txt', '52card.txt']
To sort keeping the similar letters together, do similarly to above:
def nat_sort(s):
'''
provides a sort mechanism for strings that may or
may not lead with an integer, but groups by strings
starting after integers, if any
'''
for i, c in enumerate(s):
if not c.isdigit():
break
if not i:
return s, 0
else:
return s[i:], int(s[:i])
files.sort(key=nat_sort)
And now files returns:
['badcard.txt', 'card.txt', '1card.txt', '3card.txt', '52card.txt']