List 在python中高效地向列表添加元素

List 在python中高效地向列表添加元素,list,python-2.7,List,Python 2.7,我正在遍历一个超过300万项的列表,并给它们赋值。对于组织,我制作了一个字典,其键是整数,值是具有该分数的项目列表。根据先验知识,我不知道有多少项具有一定的分数,因此我使用+运算符附加到列表中,如下所示: for e in xs: myDict[val(e)] = myDict.get(val,[]) + [e] 我的问题是: 有没有更干净的方法 +操作的时间复杂度是多少?是创建一个全新的列表,从原始列表复制元素,然后将它们添加到中吗 如果我在向集合中添加一个元素呢 使用追加: for

我正在遍历一个超过300万项的列表,并给它们赋值。对于组织,我制作了一个字典,其键是整数,值是具有该分数的项目列表。根据先验知识,我不知道有多少项具有一定的分数,因此我使用+运算符附加到列表中,如下所示:

for e in xs:
   myDict[val(e)] = myDict.get(val,[]) + [e]
我的问题是:

  • 有没有更干净的方法
  • +操作的时间复杂度是多少?是创建一个全新的列表,从原始列表复制元素,然后将它们添加到中吗
  • 如果我在向集合中添加一个元素呢
    使用
    追加

    for e in xs:
       myDict.setdefault(val(e), []).append(e)
    
    这样可以避免每次都创建新列表。操作
    list1
    +
    list2
    需要在每次迭代中构建一个新列表,从而分配内存<代码>追加
    效率更高,因为在末尾有一个作为预分配内存的列表。例如,构建一个从空列表开始追加到包含1000万个条目的列表需要比100个内存分配多一点的内存分配

    如果键存在,dictionaries方法将返回相应的值。如果键不在字典中,则返回默认值。在这种情况下,默认值是一个列表。由于列表的易变性,我们可以在第一次迭代中将其附加到空列表,并在随后的每次迭代中将其附加到部分填充的列表


    使用
    setdefault()
    的替代方法是。做一些分析,找出哪一个更快

    是,追加并使用集合。defaultdict

    from collections import defaultdict
    
    d = defaultdict(list)
    for e in xs:
       d[val(e)].append(e)
    
    追加是一种
    0(1)
    操作,每次创建新列表时,您的方法是线性的
    0(n+k)

    如果您正在添加多个项目,您将扩展列表

    需要注意的一点是,
    my_list+=some_list
    相当于
    mylist.extend(some_list)
    ,但与
    my_list=my_list+some_list
    非常不同,前者添加到原始列表中,后者执行代码所执行的操作,将两个列表串联起来,以创建一个全新的列表

    extend
    +=
    的复杂度为
    0(k)
    ,其中k是
    某些列表的长度


    列出了python中常见操作的复杂性。

    Aha谢谢。那么setdefault方法是否返回对键值的引用呢?否则,追加将不会起任何作用。是的。如果键存在,它将返回它,否则,它将键设置为第二个参数,然后返回该参数,+=和extend之间绝对没有区别吗?也就是说,我能做+=[e]和.extend([e])并且即使在纳秒级上也看不到任何差异吗?会有纳秒级的差异,但它们都做相同的工作,我想extend可能是非常稍微快一点的操作