在迭代过程中向列表添加元素

83
我知道在迭代列表时不允许删除元素,但是在迭代时是否允许向Python列表中添加元素呢?以下是一个例子:
for a in myarr:
    if somecond(a):
        myarr.append(newObj())

我在我的代码中尝试过这个方法,看起来运行得很好,但是我不知道是不是因为我运气好,而且它将在将来的某个时候出现问题?
我不想复制列表,因为myarr非常庞大,这样会导致速度太慢。而且我需要使用somecond()来检查追加的对象。
在某个时刻,somecond(a)将会返回false,所以不会出现无限循环。
myarr中的每个对象都有一个大小,每当somecond(a)为true并且一个新对象被追加到列表中时,新对象的大小将小于a。somecond()有一个epsilon来确定对象的最小大小,如果太小,它将返回"false"。

复制一个列表不需要太多时间。这是一份浅拷贝,而不是深拷贝。 - S.Lott
@S.Lott:该列表很容易超过1亿个元素,并且上述循环会重复多次。即使是浅拷贝也会很慢。 - WesDec
3
你说你已经做到了这一点,那么你的循环是否遍历了被添加到列表中的项以及原来列表里的项? - Mike DeSimone
@WesDec:你似乎在谈论广度优先搜索。对于你所做的事情来说,一个简单的列表是不合适的。这听起来像是某种树结构,而不是一个简单的列表。 - S.Lott
3
@WesDec:此外,请不要添加道歉的评论。专注于正确地提出问题即可。 - S.Lott
1
解决这个问题的方法取决于是否希望迭代遍历新元素。 - Karl Knechtel
12个回答

1
替代方案:

reduce(lambda x,newObj : x +[newObj] if somecond else x,myarr,myarr)

1
假设您要在数组 arr 的末尾添加元素,您可以尝试我经常使用的方法:
arr = [...The list I want to work with]
current_length = len(arr)
i = 0
while i < current_length:
    current_element = arr[i]
    do_something(arr[i])
    # Time to insert
    insert_count = 1 # How many Items you are adding add the last
    arr.append(item_to_be inserted)
    # IMPORTANT!!!!  increase the current limit and indexer
    i += 1
    current_length += insert_count

这只是样板代码,如果您运行它,程序将因为无限循环而卡死。除非您需要这样做,否则不要忘记终止循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接