【问题标题】:Appending correctly with ranges python使用范围 python 正确附加
【发布时间】:2015-04-07 01:09:21
【问题描述】:

这是转置矩阵代码的一部分,该函数接受一个参数,一个列表列表。假设输入是:

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

基本上,输出应该返回

[[1, 4, 7],
 [2, 5, 8],
 [3, 6, 9]]

对于任何矩阵,依此类推。 以下代码返回

def matrix(data)
    column = len(data)
    transposed[0].append(data[0][0])
    transposed[0].append(data[1][0])
    transposed[0].append(data[2][0])
    outputs [1,4,7]

但是,当我尝试使其遵循列长度时,它会返回

   transposed[0].append(data[0:column][0])
   outputs [1,2,3]

我的代码有什么问题?

【问题讨论】:

    标签: python list matrix append


    【解决方案1】:

    您可以使用内置函数zip转置矩阵:

    def transpose(m):
        return zip(*m)
    

    来自文档:

    这个函数返回一个元组列表,其中第 i 个元组包含 每个参数序列或迭代的第 i 个元素。这 返回列表的长度被截断为最短的长度 论据序列。当有多个参数都是 长度相同,zip() 类似于 map(),初始参数为 None。使用单个序列参数,它返回一个 1 元组列表。 没有参数,它返回一个空列表。

    保证迭代的从左到右的评估顺序。 这使得将数据系列聚类为 使用 zip(*[iter(s)]*n) 的 n 长度组。

    要使其返回列表列表而不是元组列表,请返回以下列表推导:

    [list(r) for r in zip(*m)]
    

    下面是使用 append 的方法:

    def transpose(m):
        transposed = [[] for _ in range(len(m[0]))]
        for i in range(len(m)):
            for j in range(len(m[0])):
                transposed[j].append(m[i][j])
        return transposed
    

    如您所见,使用zip 要容易得多。 :)

    【讨论】:

    • 我正式觉得自己很愚蠢._。无论如何,使用我的语法它会如何工作?
    • @Juanvulcano 一秒钟,要编程。 xD
    • @Juanvulcano 好了,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2015-05-11
    • 2014-10-02
    • 1970-01-01
    • 2013-11-29
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多