2013-03-04 75 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的子类或实例,但它是一个真正的普通语法字典。另一种情况是,当你没有通过迭代器并应用于平面映射时;但每个密钥都需要特殊处理,例如将默认值应用于配置时。

相关问题