【问题标题】:Remove a tuple containing nan in list of tuples -- Python删除元组列表中包含 nan 的元组——Python
【发布时间】:2016-09-25 23:56:32
【问题描述】:

我有一长串元组,并想使用 Python 删除其中包含 nan 的任何元组。

我目前拥有的: x = [('录制开始', 0), (nan, 4), (nan, 7), ..., ('事件标记1', 150)]

我正在寻找的结果: x = [('录制开始', 0), ('事件标记1', 150)]

我尝试使用 np.isnan 及其变体,但没有成功并不断收到错误消息:输入类型不支持 ufunc 'isnan',并且无法安全地将输入强制转换为任何受支持的根据转换规则“安全”的类型

任何建议将不胜感激!

【问题讨论】:

    标签: python list tuples nan spyder


    【解决方案1】:
    res = [n for n in x if not nan in n]
    

    返回x 中没有对象nan 的所有对象。

    【讨论】:

    • 这不是测试nan 的安全方法:它只会检测到确切的nan 对象(即对象x 使得x is nan 为真)。
    【解决方案2】:

    使用列表推导:

    x = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]
    
    new = [i for i in x if nan not in i]
    

    【讨论】:

    • 小心:仅当所有nans 都是精确 相同的Python 对象时才有效。试试float('nan') in (float('nan'), 2) 看看我的意思。
    【解决方案3】:

    您可以使用列表推导来检查元组中的任何项目是否为 NaN。检查是通过首先检查类型然后使用math.isnan 来完成的,因为它不适用于其他类型:

    import math
    
    x = [('Recording start', 0), (float('nan'), 4), (float('nan'), 7), ('Event marker 1', 150)]
    res = [t for t in x if not any(isinstance(n, float) and math.isnan(n) for n in t)]
    print(res)
    

    输出:

    [('Recording start', 0), ('Event marker 1', 150)]
    

    【讨论】:

      【解决方案4】:

      至少在我对 nan 的 python 使用返回了“未定义的错误”,这就是我自己定义它的原因。 我认为您可以根据自己的需要使用 Python 过滤器功能。看例子:

      nan = float('nan')
      lst = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]
      y = filter( lambda x: nan not in x, lst)
      print y
      

      [('录制开始', 0), ('事件标记1', 150)]

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        相关资源
        最近更新 更多