Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java python中的转置矩阵_Java_Python_Python 3.x_Algorithm - Fatal编程技术网

Java python中的转置矩阵

Java python中的转置矩阵,java,python,python-3.x,algorithm,Java,Python,Python 3.x,Algorithm,我真的不明白这里的逻辑 def transpose(A): output = [['']*len(A)] * len(A[0]) for j in range(len(A[0])): for i in range(len(A)): output[j][i] = A[i][j] return output 输入:[[1,2,3],[4,5,6],[7,8,9] 预期输出:[[1,4,7]、[2,5,8]、[3,6,9]] 我的输出:

我真的不明白这里的逻辑

def transpose(A):
    output = [['']*len(A)] * len(A[0])
    for j in range(len(A[0])):
        for i in range(len(A)):
            output[j][i] = A[i][j]
    return output
输入:
[[1,2,3],[4,5,6],[7,8,9]

预期输出:
[[1,4,7]、[2,5,8]、[3,6,9]]

我的输出:
[[3,6,9],[3,6,9],[3,6,9]]

我知道我可以使用zip轻松地解决这个问题,但我只想知道为什么这段代码会返回重复的列表

新的更新,我添加了一些打印来了解流程

def transpose(A):
    output = [['']*len(A)] * len(A[0])
    for j in range(len(A[0])):
        for i in range(len(A)):
            output[j][i] = A[i][j]
            print(j)
            print(i)
            print(output)
    return output
结果如下:

0
0
[[1, '', ''], [1, '', ''], [1, '', '']]
0
1
[[1, 4, ''], [1, 4, ''], [1, 4, '']]
0
2
[[1, 4, 7], [1, 4, 7], [1, 4, 7]]
1
0
[[2, 4, 7], [2, 4, 7], [2, 4, 7]]
1
1
[[2, 5, 7], [2, 5, 7], [2, 5, 7]]
1
2
[[2, 5, 8], [2, 5, 8], [2, 5, 8]]
2
0
[[3, 5, 8], [3, 5, 8], [3, 5, 8]]
2
1
[[3, 6, 8], [3, 6, 8], [3, 6, 8]]
2
2
[[3, 6, 9], [3, 6, 9], [3, 6, 9]]
[[3, 6, 9], [3, 6, 9], [3, 6, 9]]
例如,循环的第一步。j=0,i=0。但是,输出[0][0]、输出[1][0]和输出[2][0]都由循环更改。为什么会这样

我现在很困惑。我用Java编写了相同的代码,并且运行正常

public class TransposeMatrix {
    public static int[][] transpose(int[][] A) {
        int[][] result = new int[A[0].length][A.length];
        for (int j = 0; j < A[0].length; j++) {
            for (int i = 0; i < A.length; i++) result[j][i] = A[i][j];
        }
        return result;
    }
}
公共类转置矩阵{
公共静态int[]A转置(int[]A){
int[][]结果=新int[A[0].length][A.length];
对于(int j=0;j

这个问题的链接是:

当您在python中像这样乘法列表时,实际上并不会创建新列表,而是创建对同一列表的多个引用。因此,当您更改一个列表中的值时,也会更改其他列表中的值。这就是为什么您的输出是
[[3,6,9],[3,6,9],[3,6,9]]
;它只是三个列表中的最后一个(即,来自for循环的最后一个值)

相反,您可以这样做:

def transpose(A):
    output = [['']* (len(A)) for y in range(len(A[0]))]
    # or: output = [['' for x in range(len(A))] for y in range(len(A[0]))]
    for j in range(len(A[0])):
        for i in range(len(A)):
            output[j][i] = A[i][j]
    return output

transpose([[1,2,3],[4,5,6],[7,8,9]])
返回
[[1,4,7],[2,5,8],[3,6,9]]


希望这有帮助

transposed_matrix=list(map(list,zip(*input_matrix)))
input_matrix-列表列表;转置矩阵-回答问题的列表任务列表。正如我在问题中提到的,我知道使用拉链很容易。但我的问题是,我对我提供的代码背后的逻辑感到困惑。
*
创建了许多对同一列表的引用。这是因为[[']*len(a)]由同一列表组成;因此,当您更改一个嵌套列表时,所有列表都将更改。这是乘法的行为,因为列表在Python中是可变的;将输出替换为
[[''表示A中的k]]*len(A[0])
@klauds。你是对的!非常感谢不客气!这常常使我困惑。此外,当您要复制列表时,请注意,您需要使用
.copy()
而不是简单地使用
list1=list2
,因为后者只创建引用(请参阅)