【问题标题】:Incorrect assignment of values in 2D list in pythonpython中二维列表中的值分配不正确
【发布时间】:2016-11-05 09:50:07
【问题描述】:

首先将其初始化为零后,我试图将值分配给 python 中的多维列表。 下面是 edge_strength 和 initialProb 为多维列表的代码。

    edge_strength = [[1,2,3],[3,4,5],[6,7,8]]
    initialProb = [[0]*3]*3
    initialColumn =1
    denominator = 10
    for r in range(0,3):
        initialProb[r][initialColumn] = float(edge_strength[r][initialColumn])/denominator
    print initialProb

但是当我完成并打印 initialProb 列表时,我得到的答案是 - [[0, 0.7, 0], [0, 0.7, 0], [0, 0.7, 0]] 相反,它应该是 - [[0, 0.2, 0], [0, 0.4, 0], [0, 0.7, 0]]。

谁能解释一下这种奇怪的行为和解决方法?

【问题讨论】:

    标签: python-2.7 list multidimensional-array


    【解决方案1】:

    我不明白为什么您的解决方案也不起作用。似乎 edge_strength[r][initialColumn] 被广播,尽管 initialProb[r][initialColumn] 是一个标量。如果您改为写

    ,我会期待类似的东西
    initialProb[1] = float(edge_strength[r][initialColumn])/denominator
    

    但是像这样没有意义。

    这是一个使用 numpy 的解决方法。 numpy-arrays 的优点是可以一次处理多个列。我希望这至少会有所帮助。

    import numpy as np
    initialProb = np.zeros((3,3))
    edge_strength = np.array([[1,2,3],[3,4,5],[6,7,8]])
    initialProb[:,initialColumn] = edge_strength[:,initialColumn].astype(np.float)/denominator
    

    编辑:我明白发生了什么。请参阅Python list multiplication: [[...]]*3 makes 3 lists which mirror each other when modified 当您初始化 initialProb 时,您不会得到三个不同的行,而是对同一个列表的三个引用。如果您修改列表,则所有三个都会更改。

    根据线程

    initialProb = [ [0]*3 for r in range(3) ]
    

    应该也能解决你的错误

    【讨论】:

    • 哦!初始化列表 [ [0]*3 for r in range(3) ] 的解决方案确实解决了问题:)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多