Python 附加到数组或创建数组的更优雅/更通俗的方式

Python 附加到数组或创建数组的更优雅/更通俗的方式,python,arrays,Python,Arrays,出于某种原因,考虑到我在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

出于某种原因,考虑到我在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)
因此,为了澄清,我想知道是否有更可读的方法来处理上面的最后3行。我重复了三次无效的图片[picture.album.id]


编辑:刚刚意识到我上面的代码会出错,所以我修改了它来处理这个问题。

事实上,标准库中有一个对象可以精确处理这种情况:

它将类型或函数作为其参数,该类型或函数为缺少的键生成默认值

from collections import defaultdict

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

事实上,标准库中有一个对象可以准确地处理这种情况:

它将类型或函数作为其参数,该类型或函数为缺少的键生成默认值

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以去除默认值。这并不特别适用于不可变类型,例如
int
str


例如,要求
environ
变量是常规的
dict
,而不是
集合.Mapping
的子类或实例,而是一个真实的、普通的ol'dict。另一种情况是,您甚至不需要通过迭代器并应用于平面映射;但每个键都需要特殊处理,例如applying默认为一个配置。

虽然我确实发现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以去除默认值。这并不特别适用于不可变类型,例如
int
str

例如,要求
environ
变量是常规的
dict
,而不是
集合.Mapping
的子类或实例,而是一个真实的、普通的ol'dict。另一种情况是,您甚至不需要通过迭代器并应用于平面映射;但每个键都需要特殊处理,例如applying默认为一个配置