2015-02-10 89 views
2

我知道按長度排序包含單詞的列表的列表。 這意味着列表:排序列表中的一組單詞

[[],['hello','indent'],['hi','monday'],['hi','low']] 

這導致如果排序的關鍵是長度,情況正好相反:

[['hello','indent','joe'],['hi','monday'],['hi','low'],[]] 

但我想要的東西的長度是那種既具有相同長度的那些必須進行排序按字母順序排列。即,「低」 <「星期一」,所以輸出應該是:

[['hello','indent','joe'],['hi','low'],['hi','monday'],[]] 

我必須使用哪種鍵的使用內置的排序進行排序?

編輯:但如果輸入是混合大小寫?如果它是什麼:

[['Hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]

和期望的輸出將是:

[['hello', 'indent', 'joe'], ['hi', 'monday'],['Hi', 'low'], []] 
+1

你應該使用相同的'的.sort()'它會隱生成期望的輸出我猜 – ZdaR 2015-02-10 07:06:49

+1

你可以嘗試製作一個自定義函數並將它傳遞給'key'。 – 2015-02-10 07:08:52

回答

1

這可以通過一個合適的按鍵功能在一次通過中完成。

a = [['hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']] 
a.sort(key=lambda l:(-len(l), l)) 
print a 

輸出

[['hello', 'indent', 'joe'], ['hi', 'low'], ['hi', 'monday'], []] 

爲了讓我們可以簡單地使用在每個子列表中的字符串str.swapcase()方法小寫字母先於大寫字母:

a = [['Hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']] 
a.sort(key=lambda l:(-len(l), [s.swapcase() for s in l])) 
print a 

輸出

[['hello', 'indent', 'joe'], ['hi', 'low'], ['Hi', 'monday'], []] 

如果你想排序時不區分大小寫:

a = [['Hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']] 
a.sort(key=lambda l:(-len(l), [s.lower() for s in l])) 
print a 

輸出

[['hello', 'indent', 'joe'], ['hi', 'low'], ['Hi', 'monday'], []] 
+0

在小寫字母的情況下似乎是完美的,但如果輸入是混合大小寫呢?如果它是[['Hi','monday'],[],['hello','indent','joe'],['hi','low']]並且期望的輸出將是: [['hello','indent','joe'],['hi','monday'],['Hi','low'],[]] – 2015-02-10 09:22:29

+0

@galipremsagar:這有點複雜這是因爲大寫字母在默認ASCII歸類順序中的小寫字母前面。例如'ord('H')== 72'和'ord('h')== 104'。幸運的是,我們可以通過一個簡單的技巧來解決這個問題。 – 2015-02-10 09:55:38

+0

根據不區分大小寫的順序,按列表長度和字母順序排序的技巧或關鍵是什麼? – 2015-02-10 09:58:10

1

由字母順序首先排序,然後排序通過以相反順序長度。

>>> lst = [['hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']] 
>>> lst.sort() 
>>> lst.sort(key=len, reverse=True) 
>>> print lst 
>>> [['hello', 'indent', 'joe'], ['hi', 'low'], ['hi', 'monday'], []] 

項目的順序產生的設置很大程度上取決於你目前區域。如果您希望排序算法在排序項目時考慮到區域設置,則可以執行以下操作;

>>> import locale 
>>> from functools import cmp_to_key 
>>> 
>>> # You can change your locale like below; 
>>> # locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
>>> 
>>> lst = [['hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']] 
>>> print sorted([sorted(item, key=cmp_to_key(locale.strcoll)) for item in lst], key=len, reverse=True) 
>>> [['hello', 'indent', 'joe'], ['hi', 'monday'], ['hi', 'low'], []] 
相關問題