我想在遍历列表的同时扩展它:
for idx in xrange(len(a_list)):
item = a_list[idx]
a_list.extend(fun(item))
(fun 是一个返回列表的函数。)
问题:
这已经是最好的方法了吗,还是有更好、更紧凑的方法?
备注:
from matplotlib.cbook import flatten
a_list.extend(flatten(fun(item) for item in a_list))
应该可以,但我不希望我的代码依赖于 matplotlib。
for item in a_list:
a_list.extend(fun(item))
对我来说已经足够好了,但似乎会导致无限循环。
上下文:
我有大量的节点(在一个字典中),其中一些是特殊的,因为它们在边界上。
'a_list' 包含这些特殊/边界节点的键。有时会添加节点,然后边界上的每个新节点都需要添加到“a_list”。新的边界节点可以由旧的边界节点(这里用'fun'表示)确定,每个边界节点可以添加几个新节点。
最佳答案
您是否尝试过列表理解?这将通过在内存中创建一个单独的列表,然后在理解完成后将其分配给您的原始列表来工作。基本上它与您的第二个示例相同,但它不是导入展平函数,而是通过堆叠列表理解展平它。 [编辑 Matthias:将 + 更改为 +=]
a_list += [x for lst in [fun(item) for item in a_list] for x in lst]
编辑:解释发生了什么。
所以首先会发生的是上面代码中间的这部分:
[fun(item) for item in a_list]
这会将 fun
应用于 a_list
中的每个 item
并将其添加到新列表中。问题是,因为 fun(item)
返回一个列表,现在我们有一个列表列表。因此,我们运行第二个(堆叠的)列表理解来循环遍历我们刚刚在原始理解中创建的新列表中的所有列表:
for lst in [fun(item) for item in a_list]
这将使我们能够按顺序遍历所有列表。那么:
[x for lst in [fun(item) for item in a_list] for x in lst]
这意味着将每个 lst
(我们在原始理解中创建的所有列表)中的每个 x
(即每个项目)添加到一个新列表中.
希望这更清楚。如果没有,我总是愿意进一步阐述。
关于python - 在循环中追加/扩展列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7379714/