我有一个Markov转换表的输出,它是一个59个列表的列表,每个列表有59个浮动。我想反转每个非0浮点数,然后使输出正常化,这样我又有一个概率列表,加起来等于1。在
我读过关于清单理解的教科书,这似乎很有意义,但我一辈子都不明白如何实施它。在
列表列表是m
for i in range(59):
[1/item for item in m[i] if item > 0.]
i += 1
这会运行,但不会改变m
。我在这段代码中使用item
是不是错了?我应该用别的参考资料吗?在
Tags:
[1/item for item in m[i] if item > 0.]
单独在一行上创建一个一次性对象。不是很有用。在我的建议是:用双重理解重新构建你的列表:
这个解决方案在浮点除法方面是python2/3兼容的,不管列表包含什么(整数或浮点)
编辑:引用这个问题:“我想反转每个非0浮点”,这个公式是不正确的,因为它没有包含零。所以一个更精确的版本不是过滤,而是用三元来测试表达式,这样它就可以保持零。在
^{pr2}$(
if item
是针对0测试项的快捷方式)您需要将其分配回循环中的
m[i]
:而且
i+=1
不需要,因为for
循环为您完成了这项工作。在为了避免子列表比原始子列表短,您需要将if从列表理解的末尾(基本上过滤哪些项被处理)移到前面(因此值本身是一个ternary expression,根据})的值计算得出})。在
1/item
或{1/item
或{此时,您可能应该观看演示文稿Loop like a Native,并将其重写为:
^{pr2}$[1/item for item in m[i] if item > 0.]
创建一个新列表。那你就什么都不做了。graphifer告诉您的是,您需要对新创建的列表的引用:m[i] = <your list comprehension>
将分配回列表的i
行。在另外,考虑numpy进行元素操作。演示:
相关问题 更多 >
编程相关推荐