gpt4 book ai didi

python - 如果我想迭代附加值,在迭代期间附加到列表是否安全?

转载 作者:太空狗 更新时间:2023-10-30 00:02:22 24 4
gpt4 key购买 nike

我经常发现自己编写如下代码:

mylist = [247]
while mylist:
nextlist = []
for element in mylist:
print element
if element%2==0:
nextlist.append(element/2)
elif element !=1:
nextlist.append(3*element+1)
mylist = nextlist

好吧 - 它通常不是这么简单 [而且通常它确实是长列表,我只是选择这个(参见 xkcd )是为了好玩],但我创建了一个列表,迭代它来处理这些元素。在执行此操作时,我会发现需要迭代的新内容,并将它们放入一个新列表中,然后对其进行迭代。

似乎可以这样写:

mylist=[247]
for element in mylist:
print element
if element%2 == 0:
mylist.append(element/2)
elif element !=1:
mylist.append(element*3+1)

我知道在迭代列表的同时修改列表被认为是危险的,但在这种情况下,我想迭代新元素。

这样做有危险吗?我唯一能想到的是列表可能会增长并占用大量内存(在我的许多情况下,我实际上希望在最后拥有整个列表)。还有其他我忽略的吗?

请注意:Python: Adding element to list while iterating是相关的,但解释了创建列表副本的方法,这样我们就可以避免迭代原始列表。我想问的是在我实际想要扩展迭代的特定情况下是否有任何问题。


编辑:这是更接近实际问题的内容。假设我们要生成网络的“k-core”。即删除度数小于k的所有节点。从剩余网络中删除度数小于 k 的所有节点。重复直到没有留下来删除。该算法首先会找到所有少于 k 个节点,将它们放入 to_delete 列表中。然后随着节点被删除,如果邻居的度数变为 k-1,则将其添加到列表中。这可以通过以下方式完成:

delete_list = [node for node in G.nodes() if G.degree(node)<k]
for node in delete_list:
nbrs = G.neighbors(node)
for nbr in nbrs:
if G.degree(nbr)==k:
delete_list.append(nbr)
G.remove_node(node)

最佳答案

是的,附加到您正在迭代的列表是相当安全的,至少在您这样做的方式上是这样。唯一的问题是如果列表变得如此之大以至于导致内存问题,尽管这只会对您有非常大的数字成为问题。

也就是说,在这种情况下,我可能会使用 while 循环,无论您是否希望在末尾拥有整个列表。

current = 247
result_list = [current]

while current != 1:
if current % 2 == 0:
current /= 2
else:
current = current * 3 + 1

result_list.append(current)

虽然真的我可能会使用发电机。

def collatz(start):
current = start

yield current

while current != 1:
if current % 2 == 0:
current /= 2
else:
current = current * 3 + 1

yield current

Collatz conjecture 致敬! :D

关于python - 如果我想迭代附加值,在迭代期间附加到列表是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com