在 Python 中迭代和更改嵌套列表条目

Posted

技术标签:

【中文标题】在 Python 中迭代和更改嵌套列表条目【英文标题】:Iterating through and changing nested list entries in Python 【发布时间】:2014-09-16 20:34:37 【问题描述】:

每个人。我正在使用 Networkx 1.9 模块在 Python 2.7 中编写一个简单的函数,以测试我的图形分区算法实现是否正常工作。为此,我有一个列表 dvecs,它为列表分区中的每个块提供一个列表,该列表提供有关从每个节点到分区中的类的边的信息。看一眼:

#dvecs : list of len(P) lists which correspond to a list of degree vectors of each block
    numBlocks = len(P)
    dvecs = [[]] * numBlocks

    for block in P:
        blockNo = P.index(block)
        dvecs[blockNo] = [[-1] * numBlocks] * len(block)
        for node in block:
            nodeNo = block.index(node)
            for otherBlock in P:
                otherBlockNo = P.index(otherBlock)
                dvecs[blockNo][nodeNo][otherBlockNo] = len(set(nx.neighbors(G,  node)).intersection(set(otherBlock)))

我遇到的问题是,在嵌套循环的最后一行,以 dvec[blockNo...] 开头的行,根据调试器,中间深度列表中的每个条目(对于最内层循环的每次迭代,具有由 nodeNo 指定的索引的索引都被更新为相同的值。换句话说,就好像 'node' 保持不变,并且 nodeNo 遍历块中的所有节点。这是怎么回事?

为了回应罗曼,我尝试了以下方法:

for blockNo, block in enumerate(P):
        dvecs[blockNo] = [[-1] * numBlocks] * len(block)
        for nodeNo, node in enumerate(block):
            for otherBlockNo, otherBlock in enumerate(P):
                dvecs[blockNo][nodeNo][otherBlockNo] = len(set(nx.neighbors(G, node)).intersection(set(otherBlock)))

但是,我得到了相同的行为。我错过了什么?

【问题讨论】:

注意使用枚举而不是获取 ex:***.com/questions/1185545/… 的索引 感谢 Roman,您的快速回复。我对 python 很陌生,所以直到现在我才听说过。 如果您是新手,您可能还想了解有关清理文件/其他资源的语句:***.com/questions/3012488/… 酷,谢谢。不确定它是否会通知您对我的初始帖子的编辑(我也是 SO 新手),但我尝试使用 enumerate 但我遇到了同样的问题。你能看看我贴的代码吗? 【参考方案1】:

这个:

[[]] * n

给你一个包含 same 空列表的列表,n 次。因此,附加到其中的任何一个都会附加到它们的“全部”——只有一个嵌套列表。

试试这个,它将创建 n 不同的空列表:

[[] for _ in range(n)]

【讨论】:

感谢您的提示。我改变了这个,但我遇到了同样的问题。 您必须在第一个循环中进行相同的修复,在那里您分配给dvecs[blockNo]。可能更简单的是只使用 .append([]) 而不是提前构建充满垃圾值的列表

以上是关于在 Python 中迭代和更改嵌套列表条目的主要内容,如果未能解决你的问题,请参考以下文章

python 检查项是否可迭代并迭代它。非常适合嵌套列表,在那里你不确定那里有多少个'级别'的嵌套列表

在python中迭代未知数量的嵌套循环

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

Python坑:不要使用可变对象作为函数默认值生成器不保留迭代过后的结果嵌套列表创建==和is的区

多层嵌套可迭代列表的剥皮函数

将嵌套的可迭代对象转换为列表