2013-03-04 74 views
1

由於某些原因,下面的代碼感覺有點麻煩給我所有的語法糖,我一直在Python找到,所以我想問問是否有更好的方法:更優雅/ pythonic的方式來追加到一個數組,或創建它

pictures = list_of_random_pictures() 
invalid_pictures = {} 
for picture in pictures: 
    if picture_invalid(picture): 
     if not invalid_pictures.get(picture.album.id): 
      invalid_pictures[picture.album.id] = [] 
     invalid_pictures[picture.album.id].append(picture) 

所以,只是爲了澄清,我想知道是否有一個更可讀的方式來照顧上面的最後3行。因爲我重複了3次invalid_pictures[picture.album.id],如果完全可以避免的話,似乎沒有必要。

編輯:剛纔意識到我的代碼上面會出現KeyError,所以我修改了它來處理它。

回答

4

還有就是,事實上,在標準庫的目的是與案件處理完全相同:collections.defaultdict

它作爲其參數無論是類型或函數產生一個缺少鍵的默認值。

from collections import defaultdict 

invalid_pictures = defaultdict(list) 
for picture in pictures: 
    if picture_invalid(picture): 
     invalid_pictures[picture.album.id].append(picture) 
+0

完美,謝謝:D – DanH 2013-03-04 03:27:21

2

雖然我找到喬爾的回答是通常的解決辦法,有一個經常被忽視的功能,有時preferrable。當沒有特別需要的默認值是使用dict.setdefault(),將默認時是個例外的東西(和collections.defaultdict是次優的。你的代碼,適用於使用setdefault()

pictures = list_of_random_pictures() 
invalid_pictures = {} 
for picture in pictures: 
    if picture_invalid(picture): 
     invalid_pictures.setdefault(picture.album.id, []).append(picture) 

雖然這有缺點創建大量(可能未使用的)列表,因此在將默認值設置爲列表的情況下,使用defaultdict仍然更好,然後將其複製爲常規字典以剝離默認值。特別適用於不可變類型,如intstr

For exa pep-333要求environ變量是一個常規的dict,而不是collections.Mapping的子類或實例,但它是一個真正的普通語法字典。另一種情況是,當你沒有通過迭代器並應用於平面映射時;但每個密鑰都需要特殊處理,例如將默認值應用於配置時。

相關問題