Python:在给定特定条件的情况下,为列表元素指定布尔值
假设您有以下列表:Python:在给定特定条件的情况下,为列表元素指定布尔值,python,list,boolean,Python,List,Boolean,假设您有以下列表: 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] 您希望将0指定给所有被屏蔽的值,将1指定给所有其他值。
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]
您希望将0指定给所有被屏蔽的值,将1指定给所有其他值。你怎样才能做好呢
我尝试过这个,但结果是一个空列表:
mylist=[1 for i,v in enumerate(mylist) if type(mylist[i]) is float]
结果应为数字无真/假:
mylist=[1,1,1,0,0]
编辑
我的原始列表中存在的屏蔽值的类型为numpy.ma.core.MaskedConstant。如下所示:
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]
还要注意,如果typemylist[i]是float,那么您的列表理解mylist=[1代表enumeratemylist中的i,v]与您描述的不完全一样;至少在一般情况下不是这样。您将1分配给任何不是浮动的对象,这与任何被“屏蔽”的对象不同
还要注意的是,当像[1代表i,v在enumeratemylist中,如果typemylist[i]是float]这样循环时,您是错误的,请进一步了解不要使用v,这样您就可以重写为[1代表i,uu在enumeratemylist中,如果typemylist[i]是float]。请注意下划线。它用于暗示您将转储enumerate返回的元组的第二项
最后,我说的是错误的,因为在你的列表中,我的列表[i]可以被v代替。因此,如果正确地完成,它的编写方式是:[1代表mylist中的v,如果typev是float]。但正如我所说,这与您似乎想要的略有不同。您可以尝试以下方法:
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
检查变量类型的相关函数为:
此外,当您正确使用枚举构造时,您已经使用变量v在值上循环,因此无需通过mylist[i]访问它。您可以使用int将布尔值转换为整数:
[int(isinstance(x,float)) for x in mylist]
注意,之所以这样做是因为numpy.ma.core.MaskedConstant不是浮点。您可以在此处使用映射函数:
>>> list(map(lambda x : 0 if isinstance(x,np.ma.core.MaskedConstant) else 1 , mylist))
[1,1,1,0,0]
你看不到这个答案,所以我经常给出它,尽管其他答案都是令人满意的。定义一个函数f 现在做列表理解
mylist = [f(x) for x in mylist]
事实上,我忘记了一件重要的事情,关于蒙面实例的类型。它们是numpy.ma.core.MaskedConstant,而不是字符串。因此,您的方法无法按现在的方式工作。@CF84现在您的解决方案更有意义了。我将阅读一些关于这些的内容,并编辑我的回答。我实际上忘记了一件关于隐藏实例类型的重要事情。它们是numpy.ma.core.MaskedConstant,而不是字符串。因此,您的方法不能像现在这样工作。我的方法应该可以工作,因为它不依赖字符串比较。我得到的结果是一个0值列表。没有别的了。我不明白为什么请尝试第二种方法简单的打字错误,应该是v。现在修好了谢谢,这真的很有帮助,因为它可以透视事物并提醒我函数的存在。然而,考虑到我正在编写的代码很长,我发现遵循列表理解方法更合适。@CF84这是列表理解方法。
mylist = [f(x) for x in mylist]