我想基於字符串長度對字符串列表進行排序。我嘗試按如下方式使用排序,但它似乎沒有給我正確的結果。根據字符串的長度對Python列表進行排序
xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs
['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']
什麼可能是錯誤的?
我想基於字符串長度對字符串列表進行排序。我嘗試按如下方式使用排序,但它似乎沒有給我正確的結果。根據字符串的長度對Python列表進行排序
xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs
['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']
什麼可能是錯誤的?
當您將lambda
傳遞給sort
時,您需要返回一個整數而不是布爾值。所以,你的代碼應該改爲如下:
xs.sort(lambda x,y: cmp(len(x), len(y)))
注意cmp是一個內置函數,使得返回-1如果x
小於y
,0,如果x
等於y
,則爲1 x
更大比y
。
當然,你也可以改用key
參數:
這告訴sort
方法,不管以何種關鍵函數返回訂購。
編輯:感謝balpha和魯斯蘭低於指出,你可以通過len
直接作爲給函數的關鍵參數,從而消除了對lambda
需要:
xs.sort(key = len)
正如魯斯蘭指出下面,你還可以使用內置的sorted函數,而不是list.sort
方法,這將創建一個新的列表,而不是排序現有就地:
print sorted(xs, key=len)
同一個在Eli的答案中 - 只是使用更短的形式,因爲你可以在這裏跳過lambda
部分。
創建新的列表:
>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']
就地排序:
>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
反向排序的長度? – user2922935 2017-05-03 17:43:46
@ user2922935:您可以執行xs [:: - 1]來反轉已排序的列表。 查看Dan Bader的文章:https://dbader.org/blog/python-reverse-list – Thyag 2018-02-18 07:48:41
我想添加Python的關鍵功能是如何工作的,而排序:
裝飾 - 排序 - 未裝飾設計圖案:
當使用所謂的 裝飾排序undecorate設計模式實施排序時,Python對關鍵功能的支持。
它前進3個步驟:
列表中的每個元素被暫時以「裝飾」版本,其包括施加到所述元件的鍵功能的結果取代。
該列表根據鍵的自然順序排序。
裝飾元素被原始元素替換。
指定在進行比較之前在每個列表元素上調用的函數的關鍵參數。 docs
編寫一個函數lensort來根據長度對字符串列表進行排序。
def lensort(a):
n = len(a)
for i in range(n):
for j in range(i+1,n):
if len(a[i]) > len(a[j]):
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
print lensort(["hello","bye","good"])
def lensort(list_1):
list_2=[];list_3=[]
for i in list_1:
list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
list_3.append(i[0])
return list_3
這對我的作品!
做到這一點的最簡單的方法是:
list.sort(鍵=拉姆達X:LEN(X))
1用於與'key'參數中的溶液。 – 2010-04-06 18:50:03
不需要'lambda';只需使用'key = len' – balpha 2010-04-06 19:08:59
這將按升序排列(頂部單詞的長度較小),按降序排列(底部單詞的長度較小)添加參數** reverse = True ** – 2015-08-17 09:58:32