繁体   English   中英

附加到数组或创建数组的更优雅/ pythonic方式

[英]More elegant / pythonic way to append to an array, or create it

由于某些原因,考虑到我一直在Python中发现的所有语法糖,以下代码对我来说有点麻烦,所以我想问一问是否有更好的方法:

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)

因此,为了澄清一下,我想知道是否还有一种更具可读性的方式来处理上面的最后三行。 当我重复invalid_pictures[picture.album.id] 3次时,如果完全可以避免的话,这似乎是不必要的。

编辑 :刚刚意识到我上面的代码将KeyError,所以我已经对其进行了更改以处理该错误。

实际上,标准库中有一个对象可以处理这种情况: 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)

尽管我确实找到了Joel的答案是通常的解决方案,但它还是一个经常被忽略的功能,有时是可取的。 当不是特别希望使用默认值时,可以使用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并将其复制到常规dict上以剥除默认值。 这不适用于不可变的类型,例如intstr

例如, pep-333要求environ变量是常规dict ,而不是collections.Mapping的子类或实例,而是真实的普通字典。 另一种情况是,您无需经过迭代器即可应用于平面映射。 但是每个键都需要特殊处理,例如将默认值应用于配置时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM