【问题标题】:Python: assign boolean values to list elements given a certain conditionPython:为给定条件的列表元素分配布尔值
【发布时间】:2017-08-05 21:50:36
【问题描述】:

假设您有以下列表:

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 分配给所有masked 的值,并将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 类型。

【问题讨论】:

    标签: python list boolean


    【解决方案1】:

    您可以使用int() 将布尔值转换为整数:

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

    请注意,这是因为 numpy.ma.core.MaskedConstant() 不是 float。

    【讨论】:

      【解决方案2】:

      您看不到这个答案,因此尽管其他答案令人满意,但我还是给出了它。定义一个函数f

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

      现在做列表理解

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

      【讨论】:

      • 谢谢,这真的很有帮助,因为它使事情变得清晰并让我想起了函数的存在。但是,鉴于我正在编写的代码很长,我发现遵循列表理解方法更合适。
      • @CF84 这是列表理解方法。
      【解决方案3】:

      你可以在这里使用map函数:

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

      【讨论】:

        【解决方案4】:

        像这样:

        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]。但正如我所说,这与您似乎想要的略有不同。

        【讨论】:

        • 我实际上忘记了关于masked 实例类型的重要事情。它们是numpy.ma.core.MaskedConstant,而不是字符串。所以你的方法不像现在这样奏效。
        • @CF84 现在你的workaround 更有意义了。我将阅读一些内容并编辑我的答案
        【解决方案5】:

        你可以试试这个:

        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

        此外,当您(正确地)使用 enumerate 构造时,您已经使用变量 v 循环遍历值,因此无需通过 mylist[i] 访问它。

        【讨论】:

        • 我实际上忘记了关于masked 实例类型的重要事项。它们是numpy.ma.core.MaskedConstant,而不是字符串。所以你的方法不像现在这样奏效。
        • 我的方法应该可以工作,因为它不依赖字符串比较。
        • 我得到的结果是0 值的列表。没有其他的。我不明白为什么
        • 请尝试第二种方法
        • 简单的错字,应该是“v”。现已修复
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        相关资源
        最近更新 更多