在列表列表中反转浮点数

Ric*_*mes 5 python numpy nested-lists

我有一个Markov转换表的输出,这是一个包含59个浮点数的59个列表的列表.我想反转每个非0浮点数,然后规范化输出,以便我再次列出一个概率列表,加起来为1.

我已经阅读了关于列表理解的教科书,这似乎是相关的,但我不能为我的生活理解如何实现它.

列表清单是 m

for i in range(59):
    [1/item for item in m[i] if item > 0.]
    i += 1
Run Code Online (Sandbox Code Playgroud)

这会运行,但不会改变m.我item在这段代码中使用错了吗?我应该使用其他参考吗?

tim*_*geb 8

[1/item for item in m[i] if item > 0.]创建一个新列表.然后你对该列表什么都不做.Graipher告诉您的是,您需要对新创建的列表的引用:
m[i] = <your list comprehension>将分配回i列表列表中的行.

另外,考虑numpy用于元素操作.演示:

>>> import numpy as np
>>> m = np.array([[1,2], [3, 0]])
>>> m = 1.0/m
>>> m
array([[ 1.        ,  0.5       ],
       [ 0.33333333,         inf]])
>>> m[m == np.inf] = 0
>>> m
array([[ 1.        ,  0.5       ],
       [ 0.33333333,  0.        ]])
Run Code Online (Sandbox Code Playgroud)


Gra*_*her 5

您需要将其分配回m[i]循环:

for i in range(len(m)):
    m[i] = [1./item if item != 0. else item for item in m[i]]
Run Code Online (Sandbox Code Playgroud)

而且i+=1没有必要的,因为在for循环会替你.

为了避免子列表比原始子列表短,您需要将if从列表推导的末尾(基本上过滤哪些项目处理)移动到前面(因此值本身是一个三元表达式,其值为1/item或者item,取决于的价值item).

此时你应该像Native一样观看演示循环并重写它,例如:

for i, x in enumerate(m):
    m[i] = [1./item if item != 0. else item for item in x]
Run Code Online (Sandbox Code Playgroud)


Jea*_*bre 5

[1/item for item in m[i] if item > 0.]单独在一条线上创建一个一次性物体.不太有用.

我的建议:使用双重理解重建列表列表:

m = [[1./item for item in sm if item > 0.] for sm in m]
Run Code Online (Sandbox Code Playgroud)

无论列表包含什么(整数或浮点数),此解决方案都符合Python 2/3的浮点除法

编辑:引用问题:"我想反转每个非0浮点数",公式不正确,因为它不包括零.所以更准确的版本不是过滤,而是用三元测试表达式,因此它保持零.

m = [[1./item if item else 0. for item in sm] for sm in m]
Run Code Online (Sandbox Code Playgroud)

(if item是测试项目对0的快捷方式)