2017-03-15 84 views
0

假设你有以下列表:的Python:指定布尔值列表元素给予一个特定条件

import numpy as np 

mylist=[8.4468975, 
     8.52036, 
     9.3605785, 
     np.ma.core.MaskedConstant(), 
     np.ma.core.MaskedConstant()] 

# [8.4468975, 8.52036, 9.3605785, masked, masked]   

,你要分配给0masked所有值,并1所有其他人。你怎么能正确地做到这一点?

我想这一点,但结果是一个空列表:

mylist=[1 for i,v in enumerate(mylist) if type(mylist[i]) is float] 

结果应该是数字(无真/假):

mylist=[1,1,1,0,0] 

编辑

我的原始列表中存在的masked值为numpy.ma.core.MaskedConstant

回答

1

你可以试试这个:

mylist = [1 if isinstance(v, float) else 0 for i,v in enumerate(mylist)] 

或者,你可以这样做:

mylist = [0 if isinstance(v, np.ma.core.MaskedConstant) else 1 for i,v in enumerate(mylist)] 

,所以你只设置为0,一个特定的荫罩式。

相关函数来检查变量的类型是:https://docs.python.org/2/library/functions.html#isinstance

而且,你(正确)使用枚举结构,您已经遍历与变量v的值,所以没必要对其进行访问做mylist [i]。

+0

我实际上已经忘记了关于“masked”实例类型的重要内容。它们是'numpy.ma.core.MaskedConstant',而不是字符串。所以你的方法不能像现在这样。 – FaCoffee

+0

无论如何,我的方法应该工作,因为它不依赖字符串比较。 – FLab

+0

我得到的结果是'0'值列表。没有其他的。我不明白为什么 – FaCoffee

2

像这样:

mylist=[8.4468975, 
     8.52036, 
     9.3605785, 
     masked, 
     masked] 

mylist = [0 if type(x) is numpy.ma.core.MaskedConstant else 1 for x in mylist] 

另外请注意,您的列表理解mylist=[1 for i,v in enumerate(mylist) if type(mylist[i]) is float]并不完全做你的描述;至少不是在一般情况下。您正在将1分配给任何不是float的东西,这与'masked'的任何东西都不相同。

还要注意的是循环一样[1 for i,v in enumerate(mylist) if type(mylist[i]) is float]当你(虚假不过,见进一步下跌)不使用v所以你可以改写为[1 for i,_ in enumerate(mylist) if type(mylist[i]) is float]。注意下划线。它用来暗示你将倾销enumerate()返回的元组的第二项。

最后,我说错了,因为在你的列表中,理解mylist[i]可以用v代替。如此正确地完成它将被写为:[1 for v in mylist if type(v) is float]。但正如我所说,这与你想要的略有不同。

+0

嗯,是的,它是有缺陷的。我不应该在清晨编码... – FaCoffee

+0

我实际上已经忘记了关于'masked'实例类型的重要事情。它们是'numpy.ma.core.MaskedConstant',而不是字符串。所以你的方法不能像现在这样。 – FaCoffee

+1

@ CF84现在您的*解决方法*更有意义。我会阅读这些内容并编辑我的答案 –

2

您可以使用int()投你的布尔为整数:

[int(isinstance(x,float)) for x in mylist] 

注意这个工程,因为numpy.ma.core.MaskedConstant()不是float

1

可以使用map功能在这里:

>>> list(map(lambda x : 0 if isinstance(x,np.ma.core.MaskedConstant) else 1 , mylist)) 

[1,1,1,0,0] 
1

你没有看到这个答案,往往因此,我给它,尽管其他的答案是令人满意的。定义一个函数f

def f(x): 
    if isinstance(x, np.ma.core.MaskedConstant): 
     return 0 
    else: 
     return 1 

现在做列表理解

mylist = [f(x) for x in mylist] 
+0

谢谢,这真的很有帮助,因为它将事物置于透视之中,并让我想起功能的存在。然而,鉴于我正在处理的冗长代码,我发现它更适合遵循列表理解方法。 – FaCoffee

+0

@ CF84这是列表理解方法。 – Elmex80s

相关问题