首页 > 解决方案 > Python新手:用两个列表计算其中一个是二维列表

问题描述

是的,首先我是 Python 新手。我的任务是编写一些类似的、更简单的层次分析过程 (ahp) 变体。我不允许携带任何像 numpy 之类的包。

我需要一个列表输入 [n*m],例如:

liste = [[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]

我已经意识到它是这样的:

liste = input("Put in the Matrix: ")

我需要总结列:

 col_sums = [ sum(x) for x in zip(*liste) ]

现在它需要计算标准化列表,它看起来像这样:

liste = [[1.0,2.0,3.0],
        [4.0,5.0,6.0],
        [7.0,8.0,9.0]]

list_norm = 1.0/col_sums[0] 2.0/col_sums[1] ...
            4.0/col_sums[0] 5.0/col_sums[1] ...
            7.0/col_sums[0] 8.0/col_sums[1] ...

实现它的正确方法是什么?

感谢您的反馈和关注。

标签: python

解决方案


到目前为止,您做其他所有事情的方式看起来都是正确的。你只需要另一个列表理解list_norm

liste = [[1.0,2.0,3.0],
        [4.0,5.0,6.0],
        [7.0,8.0,9.0]]
col_sums = [ sum(x) for x in zip(*liste) ]
list_norm = [[e / col_sums[c] for c, e in enumerate(row)] for row in liste]
# [[0.083, 0.133, 0.166], 
#  [0.333, 0.333, 0.333], 
#  [0.583, 0.533, 0.5]]

我们enumerate()在这里使用获取元素及其列表索引,并使用索引从 中获取适当的总和col_sums

@kaya3 在评论中提到的替代,更清洁,解决方案:

list_norm = [[e / s for e, s in zip(row, col_sums)] for row in liste]

wherezip()从它的两个参数产生对应的元素对。从功能上讲,这是相同的代码片段,并产生相同的东西。


没有任何特别干净的方法可以将整个过程集中在一条线上,但我认为没有必要这样做。


推荐阅读