python - 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] ...
实现它的正确方法是什么?
感谢您的反馈和关注。
解决方案
到目前为止,您做其他所有事情的方式看起来都是正确的。你只需要另一个列表理解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()
从它的两个参数产生对应的元素对。从功能上讲,这是相同的代码片段,并产生相同的东西。
没有任何特别干净的方法可以将整个过程集中在一条线上,但我认为没有必要这样做。
推荐阅读
- ssl - 使用数字证书和数字签名的安全认证
- c# - Removing items from LinkedList<>
- node.js - 使用 ANY 运算符将 SQL 查询转换为 Sequelize findAll 函数时出现问题
- package - 找到的程序集的清单定义与程序集引用不匹配:HRESULT 异常:0x80131040
- azure - Azure ARM template Logic App authorize OneDrive For Business account when Deploy
- javascript - 当用户离开页面时自动提交表单
- azure - Connect to Azure Database for Postgresql through VPN
- cocoa - 如何在 NSTextView 上禁用 Alt-Drag 选择?
- c# - What is difference between Transform Rotate and forward Rotate?
- rest - API Design for Validaion and Save scenarios