【问题标题】:How do I populate the diagonals of a matrix with strings in python?如何在python中用字符串填充矩阵的对角线?
【发布时间】:2012-10-23 19:37:57
【问题描述】:

我正在尝试使用以下代码在 python 中填充空矩阵(列表列表)的对角线:

source=['a','b','c']

rows=[]
for x in source:
    rows.append('')
matrix=[]
for x in source:
    matrix.append(rows)

print "before populating", matrix

for x in range (0, len(source)):
    matrix[x][x]=source[x]

print "after populating", matrix

我意识到这不是完成此任务的最有效方法,但这实际上似乎是我遇到的最少问题。

我得到的输出是这样的:

[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]

但我希望的输出是这样的:

[['a', '', ''], ['', 'b', ''], ['', '', 'c']]

知道出了什么问题吗?非常感谢!

【问题讨论】:

    标签: python list matrix


    【解决方案1】:
    for x in source:
        matrix.append(rows)
    

    您使用对 rows 的引用填充 ma​​trix。您可以使用 切片来制作副本

    >> rows = ['a','b','c']
    >>> matrix = [rows[:] for _ in range(len(rows))]
    >>> matrix
    [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
    >>> matrix[1][1]=' '
    >>> matrix
    [['a', 'b', 'c'], ['a', ' ', 'c'], ['a', 'b', 'c']]
    

    【讨论】:

    • 这就是问题所在!谢谢!我很困惑!
    • 我知道 - 这在 Python 中可能会造成混淆。与 C++ 不同,在 Python 中分配对象会创建对现有对象的引用——而不是位拷贝。对于简单的列表,slice 是一种方法;对于更复杂的情况,使用模块 copy
    【解决方案2】:

    一个简单的列表理解应该可以做到:

    In [62]: source=['a','b','c']
    
    In [63]: [[""]*i + [x] + [""]*(len(source)-i-1) for i,x in enumerate(source)]
    Out[63]: [['a', '', ''], ['', 'b', ''], ['', '', 'c']]
    
    In [64]: source=['a','b','c','d']
    
    In [65]: [[""]*i + [x] + [""]*(len(source)-i-1) for i,x in enumerate(source)]
    Out[65]: [['a', '', '', ''], ['', 'b', '', ''], ['', '', 'c', ''], ['', '', '', 'd']]
    

    【讨论】:

    • ISWYDT。谢谢!没有告诉我我的问题是什么,但非常经济和清晰。谢谢!
    【解决方案3】:

    问题在于这段代码:

    rows=[]
    for x in source:
        rows.append('')
    matrix=[]
    for x in source:
        matrix.append(rows)
    

    您每次都提供相同的参考

    for x in range (0, len(source)):
        matrix[x][x]=source[x]
    

    这将修改同一个对象。解决方案:使用副本:

    matrix=[]
    for x in source:
        # use a copy.
        matrix.append(rows[:])
    

    【讨论】:

      【解决方案4】:

      您需要为矩阵中的每一行创建一个新的独立元素行。执行matrix.append(rows) 只会一次又一次地插入对同一个列表实例的引用。

      改用matrix.append(list(rows))

      对于更复杂的情况,copy 模块可能会有所帮助。

      问题的根源在于 Python 只处理对对象实例的引用,它没有 C 中的“变量”概念,因此在进行赋值时不会复制对象。取而代之的是一个新的参考。

      【讨论】:

        【解决方案5】:
        source=['a','b','c']
        
        matrix = [['' if i!=j else source[i] for i in range(len(source))]
             for j in range(len(source))]
        

        【讨论】:

          【解决方案6】:

          其他人已经解释了您的代码发生了什么,但这里有另一种选择......

          如果你不介意使用numpy 那么:

          import numpy as np
          np.diag(['a', 'b', 'c']).tolist()
          # [['a', '', ''], ['', 'b', ''], ['', '', 'c']]
          

          如果您要处理矩阵,那么查看numpyscipy 可能不是一个坏主意...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-18
            • 2015-05-15
            • 1970-01-01
            • 2013-03-16
            • 2014-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多