python排序自定義
A. python2 自定義排序規則如何排序
#分類函數
defselect(i):
return(i%3>0)and(i%2==0)
#不同分類的排序演算法
sort_funcs={
#升序
True:lambdalst:sorted(lst,reverse=False),
#降序
False:lambdalst:sorted(lst,reverse=True)
}
#混合排序
defmix_sort(arr,select,sort_funcs):
sequence={key:iter(func(vfori,vinenumerate(arr)ifselect(i)==key))forkey,funcinsort_funcs.iteritems()}
return[next(sequence[select(i)])fori,_inenumerate(arr)]
#輸出
arr=[0,1,2,3,4,5,6,7,8,9]
printmix_sort(arr,select,sort_funcs)
>>[9,7,2,6,4,5,3,1,8,0]
arr=[1,5,4,3,10,7,19]
printmix_sort(arr,select,sort_funcs)
>>[19,7,4,5,10,3,1]
在 arr =[0,1,2,3,4,5,6,7,8,9] 中,下標和值相同,比較好說明
arr 中 [2, 4, 8] 符合 「不能被 3 但可以被 2 整除」,升序為 [2, 4, 8]
arr 中 [0, 1, 3, 5, 6, 7, 9] 不符合「不能被 3 但可以被 2 整除」,降序為 [9, 7, 6, 5, 4, 1, 0]
按原先的位置組合,結果為[9,7,2,6,4,5,3,1,8,0]
不知道我理解得對不對
B. python中字元怎麼比較大小排序
任何兩個對象都可以比較
相同類型的對象(實例),如果是數字型(int/float/long/complex),則按照簡單的大小來比較;如果是非數字型,且類(型)中定義了__cmp__(含__gt__,__lt__等)則按照__cmp__來比較,否則按照地址(id)來比較
不同類型的對象(實例),如果其中一個比較對象是數字型(int/float/long/complex等),則數字型的對象<其它非數字型的對象;如果兩個都是非數字型的對象,則按照類型名的順序比較,如{}
<
"abc"(按照"dict"
<
"str"),而"abc"
>
[1,2],
"abc"
<
(1,2)。
對於自定義的類(型)實例,如果繼承自基本類型,則按照基本類型的規則比較(1-3)。否則,old-style
class
<
new-style
class,
new-style
class之間按照類型名順序比較,old-style
class之間按照地址進行比較
bool類型是int的子類,且true=1,
false=0,比較時按照1-4來比較,如true
>
-1,
true
<
4.2,
true
<
"abc"等
上面的回答是針對python2.x,3.x的有較大的變化,如str和int比較時會拋出異常等。
回到題目,字元和數字的比較符合規則3,所以數字<字元。舉個例子,如100和'a'(ord('a')=97),有
100<'a'
C. python列表排序方法
列表的sort方法就是用來進行排序的。
主要就是兩個參數,key,reverse
先說reverse,這個很簡單,就是指出是否進行倒序排序:一般情況下,1排在2的前面,而倒序則相反。
key參數:一般它是一個函數,它接受列表中每一個元素,返回一個可用用於比較的值。
s=[1,2,3,4,5]
s.sort(key=lambda _: _**2%7)
print(s)
輸出的是:[1, 3, 4, 2, 5]
如果看不懂lambda表達式,可以看這一段等價的寫法:
def myfn(x):
....return (x * x) % 7
s=[1,2,3,4,5]
s.sort(key=myfn)
print(s)
輸出的結果是一樣的。
key使用的函數可以是自定義函數也可以pytho內置的函數,或者是某個類或者實例的方法,只要它能接受一個參數,返回一個可比較的值即可。比如這樣:
s=[[1,2,4],[3,3,5],[1,1,1],[5,7,9]]
s.sort(key=max) # 直接使用max函數作為排序依據
print(s)
[[1, 1, 1], [1, 2, 4], [3, 3, 5], [5, 7, 9]]
D. python sort()用法
Python中的sort()方法用於數組排序,本文以實例形式對此加以詳細說明:
一、基本形式
列表有自己的sort方法,其對列表進行原址排序,既然是原址排序,那顯然元組不可能擁有這種方法,因為元組是不可修改的。
x = [4, 6, 2, 1, 7, 9]
x.sort()
print x # [1, 2, 4, 6, 7, 9]
如果需要一個排序好的副本,同時保持原有列表不變,怎麼實現呢
x =[4, 6, 2, 1, 7, 9]
y = x[ : ]
y.sort()
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]
注意:y = x[:] 通過分片操作將列表x的元素全部拷貝給y,如果簡單的把x賦值給y:y = x,y和x還是指向同一個列表,並沒有產生新的副本。
另一種獲取已排序的列表副本的方法是使用sorted函數:
x =[4, 6, 2, 1, 7, 9]
y = sorted(x)
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]
sorted返回一個有序的副本,並且類型總是列表,如下:
print sorted('Python') #['P', 'h', 'n', 'o', 't', 'y']
二、自定義比較函數
可以定義自己的比較函數,然後通過參數傳遞給sort方法:
def comp(x, y):
if x < y:
return 1
elif x > y:
return -1
else:
return 0
nums = [3, 2, 8 ,0 , 1]
nums.sort(comp)
print nums # 降序排序[8, 3, 2, 1, 0]
nums.sort(cmp) # 調用內建函數cmp ,升序排序
print nums # 降序排序[0, 1, 2, 3, 8]
三、可選參數
sort方法還有兩個可選參數:key和reverse
1、key在使用時必須提供一個排序過程總調用的函數:
x = ['mmm', 'mm', 'mm', 'm' ]
x.sort(key = len)
print x # ['m', 'mm', 'mm', 'mmm']
2、reverse實現降序排序,需要提供一個布爾值:
y = [3, 2, 8 ,0 , 1]
y.sort(reverse = True)
print y #[8, 3, 2, 1, 0]
以上是雲棲社區小編為您精心准備的的內容,在雲棲社區的博客、問答、公眾號、人物、課程等欄目也有的相關內容,歡迎繼續使用右上角搜索按鈕進行搜索python , 方法 sort python sort方法、python魔術方法詳解、python實例方法詳解、list.sort 使用方法、c list.sort 使用方法,以便於您獲取更多的相關知識。
E. python自定義模式排序代碼解讀問題
sorted(L, key = by_name),是將L中的每個元素作用於by_name函數,比如第一步,內部是將L中的第一個元素('Bob', 75)作用於by_name,獲取到Bob,然後依次獲取其他的元素,再進行排序
F. 在Python 3 中的自定義排序怎麼辦
python3 sorted取消了對cmp的支持。
python3 幫助文檔:
sorted(iterable, key=None, reverse=False)
reverse是一個布爾值。如果設置為True,列表元素將被倒序排列,默認為False
key接受一個函數,這個函數只接受一個元素,默認為None
- my_alphabet = ['a', 'b', 'c']def custom_key(word):
- numbers = [] for letter in word:
- numbers.append(my_alphabet.index(letter)) return numbers# python中的整數列表能夠比較大小# custom_key('cbaba')==[2, 1, 0, 1, 0]x=['cbaba', 'ababa', 'bbaa']
- x.sort(key=custom_key)123456789101112
- students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]
- sorted(students,key=lambda x: x[2]) #按照年齡來排序12
- #元組內(e1, e2, e3)的優先順序排列為: e1 > e2 > e3sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x)#input: 'asdf234GDSdsf23'#output: 'addffssDGS33224'12345
x.isdigit()的作用是把數字放在後邊(True),字母放在前面(False).
x.isdigit() and int(x) % 2 == 0的作用是保證數字中奇數在前(False),偶數在後(True)。
x.isupper()的作用是在前面基礎上,保證字母小寫(False)在前大寫在後(True).
最後的x表示在前面基礎上,對所有類別數字或字母排序。
Key的作用原理
Python2中的自定義布爾函數cmp=custom_cmp(x, y)由Python3中的key=custom_key(x)代替。
在python3中,待比較元素x通過custom_key函數轉化為Python能比較的值custom_key(x),進而再基於返回值進行排序。
例子1:
例子2
關於lambda表達式
例子3
默認sorted([True, False])==[False, True] (False=0 < True=1)
一個字元串排序,排序規則:小寫<大寫<奇數<偶數
G. python3沒有了Cmp函數,自定義的排序sort方法不是需要它作參數嗎!!怎麼辦
python3開始沒這個函數了,官方文檔是這么寫的
The cmp() function should be treated as gone, and the __cmp__() special method is no longer supported. Use __lt__() for sorting, __eq__() with __hash__(), and other rich comparisons as needed. (If you really need the cmp() functionality, you could use the expression (a > b) - (a < b) as the equivalent for cmp(a, b).)
大意就是cmp()函數已經「離開」了,如果你真的需要cmp()函數,你可以用表達式(a > b) - (a < b)代替cmp(a,b)
key和reverse還是可以用的。
如果解決了您的問題請採納!
如果未解決請繼續追問!
H. 求python中,自定義的復雜數據結構,快速排序的方法
應該是你sorted的使用方式不對吧,它可以對name.key這樣的形式進行排序的。
classm:
def__init__(self,name,id):
self.name=name
self.id=id
@property
defkey(self):
returnself.name
deflen(self):
returnlen(self.name)
def__str__(self):
return'{{'name':'{0}','id':{1}}}'
.format(self.name,self.id)
__repr__=__str__
s=[m('zzzz',1),m('aaa',4)]
l=[('source',s),
]
#直接屬性排序
l.append(('byname',sorted(s,key=lambdax:x.name)))
l.append(('byid',sorted(s,key=lambdax:x.id)))
#屬性函數排序
l.append(('bykey',sorted(s,key=lambdax:x.key)))
#函數排序
l.append(('bylen()',sorted(s,key=lambdax:x.len())))
foreinl:
print(e[0])
print(e[1])
這是輸出的結果:
source
[{'name':'zzzz','id':1},{'name':'aaa','id':4}]
byname
[{'name':'aaa','id':4},{'name':'zzzz','id':1}]
byid
[{'name':'zzzz','id':1},{'name':'aaa','id':4}]
bykey
[{'name':'aaa','id':4},{'name':'zzzz','id':1}]
bylen()
[{'name':'aaa','id':4},{'name':'zzzz','id':1}]
上述四種用法都是沒問題的,至於name[key]的形式同樣是OK的。
sorted的參數key,它是一個函數,簡單的話可以直接用lambda,復雜點的可以定義成有一個參數的函數,比如:
defsorted_other(item):
ifhasattr(item,'name'):
returnitem.name
else:
returnNone
l.append(('byotherfunc',sorted(s,key=sorted_other)))
I. python怎樣用自定義函數對列表排序
您好!我寫了一個升序的方法供您參考:
請注意,要在 idle 中運行這個方法,並輸入你希望的值
下面講解一下:
方法體的第一句用於把你輸入的數字儲存在列表中,這句可以用於其他許多場合
後續的代碼就是不斷地遞歸,從而達到升序的效果
有不懂的可以問我哦~望採納!