2016-09-19 81 views
3

假設我有一個我想排序的項目列表:items = [ item1, item2, item3 ]。我想用對它們進行排序的屬性是item.data.value,所以我通常去:Python按屬性排序可以是None

sorted(items, key=attrgetter('data.value')) 

而這會工作得很好。但是,data實際上可以是None,所以顯然我無法訪問value

你通常如何處理這種情況?

PS:既不是this question也不是this one幫助。

+0

你想如何對無值進行排序? – RemcoGerlich

+0

不管是高優先還是低優先,我都不介意。把它們放在列表的尾部會讓我更有意義。 – dabadaba

+0

你可以用一個像這樣的哨兵值替換Nones的答案建議:http://stackoverflow.com/a/26348624/393010 – Moberg

回答

1
sorted(items, key=lambda i: i.data.value if i.data else 0) 
+0

是的,這是我剛剛嘗試。 'None'而不是'0',但我認爲兩種比較都會評估相同的事情。 – dabadaba

0

只是篩選的無分揀

sorted(filter(None, items), key=attrgetter('data.value')) 
+0

同樣捏;;聰明的人認爲一樣:D – thiruvenkadam

+0

我不想過濾項目。 – dabadaba

+0

@thiruvenkadam;) – armak

0

之前,如果您還沒有得心應手的函數,返回你想那麼就​​寫自己的關鍵。

def item_key(item): 
    try: 
     return item.data.value 
    except AttributeError: 
     return None 

sorted(items, key=item_key) 
+0

我可以給這個lambda嗎?我其實只是試過這個:'sort(items,key = lambda x:x.data.value if x.data else None)'這是否類似於你的回答? – dabadaba

+0

@dabadaba它不是等價的,但它也會滿足規範(如果'item'本身是'None'或者如果item.data不是'None',但它沒有'value'屬性或者'item.data.value'不存在的頻率,所以我做了任意的假設)。無論如何,我會在這種情況下使用命名函數。 – Goyo

0

只是先將None值過濾後再發送給排序。

sorted(filter(None, items), key=attrgetter('data.value')) 

如果你真的想要的無項目過多,你可以做這樣的事情:

# items already defined with values 
new_items_list = sorted(filter(None, items), key=attrgetter('data.value')) 
new_items_list.extend([None] * (len(items) - len(new_items_list))) 

但是,我不知道你是否真的需要在沒有項目。

編輯:修復將保留無項目的結束代碼。

+0

我確實需要'None'項目。 – dabadaba

+0

最新的編輯會給你無項目以及 – thiruvenkadam

2

用作鍵元組,像(False, value)。如果值爲None,那麼元組應該是(True, None)

元組先通過它們的第一個元素進行比較,然後是第二個元素等。 False在True之前排序。所以所有的None值都會被排序到最後。

def none_to_end_key(item): 
    value = item.data.value if item.data else None 
    return (value is None, value) 

sorted(items, key=none_to_end_key) 

將所有的None值排序到最後。

我現在看到你已經標記了你的問題Python-2.7,那麼這可能是矯枉過正。在Python 3中,將None與整數或字符串進行比較會引發異常,因此您不能簡單地使用None和其他值對列表進行排序,並且需要類似這樣的內容。

+0

這不僅是3兼容,但不同於目前接受的答案,即使item.data.value同時具有負值和正值,也會將Nones置於最後。如果你真的想要的話,你甚至可以把它排成一行(我認爲這不是必須的,但有些人似乎因爲某些原因考慮了殺手功能)。 – DSM