- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我经常发现自己编写如下代码:
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/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!