2010-04-06 190 views
63

我想基於字符串長度對字符串列表進行排序。我嘗試按如下方式使用排序,但它似乎沒有給我正確的結果。根據字符串的長度對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'] 

什麼可能是錯誤的?

回答

127

當您將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) 
+2

1用於與'key'參數中的溶液。 – 2010-04-06 18:50:03

+15

不需要'lambda';只需使用'key = len' – balpha 2010-04-06 19:08:59

+7

這將按升序排列(頂部單詞的長度較小),按降序排列(底部單詞的長度較小)添加參數** reverse = True ** – 2015-08-17 09:58:32

61

同一個在Eli的答案中 - 只是使用更短的形式,因爲你可以在這裏跳過lambda部分。

創建新的列表:

>>> xs = ['dddd','a','bb','ccc'] 
>>> sorted(xs, key=len) 
['a', 'bb', 'ccc', 'dddd'] 

就地排序:

>>> xs.sort(key=len) 
>>> xs 
['a', 'bb', 'ccc', 'dddd'] 
+3

反向排序的長度? – user2922935 2017-05-03 17:43:46

+1

@ user2922935:您可以執行xs [:: - 1]來反轉已排序的列表。 查看Dan Bader的文章:https://dbader.org/blog/python-reverse-list – Thyag 2018-02-18 07:48:41

3

我想添加Python的關鍵功能是如何工作的,而排序:

裝飾 - 排序 - 未裝飾設計圖案:

當使用所謂的 裝飾排序undecorate設計模式實施排序時,Python對關鍵功能的支持。

它前進3個步驟:

  1. 列表中的每個元素被暫時以「裝飾」版本,其包括施加到所述元件的鍵功能的結果取代。

  2. 該列表根據鍵的自然順序排序。

  3. 裝飾元素被原始元素替換。

指定在進行比較之前在每個列表元素上調用的函數的關鍵參數。 docs

1

編寫一個函數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"]) 
0
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 

這對我的作品!

2

做到這一點的最簡單的方法是:

list.sort(鍵=拉姆達X:LEN(X))

相關問題