Python字符串排序


看了西紅柿的博客,此文純搬運,方便自己查詢用。

原文:https://www.cnblogs.com/tomato0906/articles/4890701.html

1、python中的字符串類型是不允許直接修改元素的。必須先把要排序的字符串放在容器里,如list。

python中list容器的sort()函數沒有返回值。所以在python中對字符串排序需要好幾行代碼:

s="string"

l=list(s)

l.sort()

s="".join(l)

print s    'ginrst'

 

一行代碼搞定字符串排序的方法:

s="string"

s="".join((lambda x:(x.sort(),x)[1])(list(s)))

---------------------------------------------------------------------------------------------------------

string = ''''' 
the stirng 
Has many 
line In 
THE fIle 
'''  
list_of_string = string.split()  
print list_of_string     #將字符串分離開,放入列表中  
print '*'*50  
  
  
def case_insensitive_sort(liststring):  
    listtemp = [(x.lower(),x) for x in liststring] #將字符串列表,生成元組,(忽略大小寫的字符串,字符串)  
    listtemp.sort()<span style="white-space:pre">       </span>#對元組排序,因為元組為:(忽略大小寫的字符串,字符串),就是按忽略大小寫的字符串排序  
  
    return [x[1] for x in listtemp]  #排序完成后,返回原字符串的列表  
  
print case_insensitive_sort(list_of_string)  #調用起來,測試一下  

2、使用內建函數

sorted(iterable[,cmp[, key[,reverse]]])

Return a new sorted list from the items in iterable.

key specifies a function of one argument that is used to extract a comparison key from each list element:key=str.lower. The default value isNone.

 

 使用參數key=str.lower

代碼如下:

def case_insensitive_sort2(liststring):  
    return sorted(liststring,key = str.lower)  

3、

使用list的sort方法:

 

The sort() method takes optional arguments for controlling the comparisons.

cmp specifies a custom comparison function of two arguments (list items) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument: cmp=lambda x,y:cmp(x.lower(), y.lower()). The default value is None.

key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None.

reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed

def case_insensitive_sort3(liststring):  
    liststring.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))  
  
  
case_insensitive_sort3(list_of_string)  
print list_of_string  

———————————————————————————————————————————

根據字符串長度來排序

給定字符串:xs = ['dddd','a','bb','ccc'] 

輸出排序的結果:['a','bb','ccc','dddd']
解決1:
xs.sort(key=len)
解決2:
xs.sort(lambda x,y: cmp(len(x), len(y)) 
注意:當傳遞lambda給sort時,需要返回integer,而不能為bool數
使用:
xs.sort(lambda x,y: len(x) < len(y))則不對。
——————————————————————————————————————————

python根據字符串中的內嵌的數字排序

l = [ 'ch9.txt', 'ch10.txt', 'ch1.txt', 'ch3.txt', 'ch11.txt' ]
排序完成后
l=[ 'ch1.txt', 'ch3.txt', 'ch9.txt', 'ch10.txt', 'ch11.txt' ]
import re
l = [ 'ch9.txt', 'ch10.txt', 'ch1.txt', 'ch3.txt', 'ch11.txt' ]
p = re.compile("(\d+)")
def my_cmp(v1, v2):
d1 = [int(i) for i in p.findall(v1)][0]
d2 = [int(i) for i in p.findall(v2)][0]
return cmp(d1, d2)

l.sort(my_cmp)
print l

>>> import re
>>>
>>> l = [ 'ch9.txt', 'ch10.txt', 'ch1.txt', 'ch3.txt', 'ch11.txt' ]
>>>
>>> p = re.compile("(\d+)")
>>>
>>> def my_cmp(v1, v2):
... d1 = [int(i) for i in p.findall(v1)][0]
... d2 = [int(i) for i in p.findall(v2)][0]
... return cmp(d1, d2)
...
>>>
... l.sort(my_cmp)
>>>
>>> print l
['ch1.txt', 'ch3.txt', 'ch9.txt', 'ch10.txt', 'ch11.txt']
>>>

一句代碼足以
l.sort(key = lambda x:int(re.match('\D+(\d+)\.txt',x).group(1)))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM