2017-07-07 41 views
0

我的排序方法有問題。python3按attr排序對象列表相同的值

這是包含在列表我的對象: 地址類,隨着城市屬性

我的目錄looklike(簡體):

[Address('Paris'), Address('Denver'), Address('Paris'), Address('Test'), Address('Denver')] 

在這個例子中,我有兩個重複的城市:巴黎和丹佛,

我想有這樣的結果:

[Address('Devenr'), Address('Denver'), Address('Paris'), Address('Paris'), Address('Test')] 

按重複計數排序,如果數字相同,則按字母數字順序排序。

我想:

self.dictionnary.sort(key=lambda address: len([x for x in self.dictionnary if address.city == x.city])) 

通過這個不工作...

誰能幫助我?

預先感謝您!

回答

1
import collections 
counts = collections.Counter(address.city for address in self.dictionnary) 
self.dictionnary.sort(key=lambda address: (-counts[address.city], address.city)) 

通過使用Counter算在單獨的步驟重複的,您將每個你需要一個新的關鍵時期掃描列表的開銷。這對長列表的運行時間會產生很大的影響。關鍵然後成爲一個元組;通過計數的負數,更大的計數將首先按照排序順序排列。只有當計數相等時,纔會考慮元組的第二部分,即城市名稱本身。

+0

請問downvoter能解釋一下自己嗎?我只是檢查了這個代碼,它完美的工作。再加上它比每次需要新密鑰時計算整個列表更有效率。 –

+1

我可以看出爲什麼有人可能會低估這一點:這是一個只有代碼的答案。一般來說,[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高您的帖子的質量。 – vaultah

+0

@vaultah對我來說值得評論,而不是downvote。我爲自己確實不正確的事情預留了我的讚譽。 –

1

問題是,巴黎和丹佛都有計數2,所以他們沒有得到排序。

如果將字符串添加到排序,以便關係正詞法打破它應該工作

例子:

from collections import Counter 

l = ['a', 'b', 'a', 'b', 'c'] 
c = Counter(l) 
l.sort(key=lambda x : -c[x]) 
# l is unchanged 
l.sort(key=lambda x : (-c[x],x)) 
# l is ['a', 'a', 'b', 'b', 'c'] 

編輯:馬克的解決方案使用計數器比訴說着每一次好得多。我要去偷那個想法