【问题标题】:python - list comprehensions including conditions like if and else/ error handlingpython - 列表推导包括 if 和 else/ 错误处理等条件
【发布时间】:2019-02-20 00:46:01
【问题描述】:

是否有一种巧妙的方法可以在列表推导中包含条件以执行以下操作:

index = [y for y, s in enumerate(data_time_filtered) if next0 in s]

我想在上面的索引定义中添加以下条件:

if next0 in s:
    data_filtered.append(data_time_filtered[index[0]])

else:
    missing_data.append(next0)

目前我的代码中发生的事情是:

IndexError: list index out of range

当找不到值时。使用 else 和 if 条件处理它是否更有效,或者在这种情况下是否有另一种/更好的错误处理方式?

扩展:

data_time_filtered 是一个字符串列表,例如:

https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/002/MYD021KM.A2018002.1330.006.2018003152138.hdf
https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/004/MYD021KM.A2018004.1330.006.2018005220236.hdf
https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/006/MYD021KM.A2018006.1330.006.2018007165439.hdf
https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/009/MYD021KM.A2018009.1330.006.2018010190624.hdf

next0 是以下形式的字符串:/XXX/ 例如/002/

索引函数正在寻找data_time_filtered 中出现next0 的行并返回一个索引,该索引用于提取该行并将其附加到不同的列表中。

问题在于,有时next0 给出的字符串不包含在创建上述错误消息的列表中。

我想要的是:

如果索引与这样的数字交叉,它应该将此数字附加到 missing_data 列表中,而不是破坏并产生错误。

更新:

我试过这个:

try:
    index = [y for y, s in enumerate(data_time_filtered) if next0 in s]
    data_filtered.append(data_time_filtered[index[0]])

except IndexError:
    missing_data.append(next0)

它奏效了:)。但是,在不同行的稍后阶段,正在发生 IndexError。仍在检查如何解决这个问题

【问题讨论】:

  • 这里有两个不同的列表要创建
  • @Bazingaa 你的意思是missing_data 列表?是的当然。但我想知道是否可以在索引定义中添加 if 和 else 条件
  • 能否请您添加一些示例值列表和所需的输出。很容易理解您的要求。
  • 目前还不清楚您到底想要什么。提供一些示例输入/输出。我认为您想要的是生成两个不同列表的单行列表理解。我不认为可以这样做,因为在列表理解代码的左侧,您将有一个列表名称。

标签: python list conditional-statements list-comprehension


【解决方案1】:

不是将条件放入index的定义中,而是错误处理如下:

try:
    index = [y for y, s in enumerate(data_time_filtered) if next0 in s]
    data_filtered.append(data_time_filtered[index[0]])

except IndexError:
    missing_data.append(next0)

更实用,因为可以在except IndexError 部分中包含更多条件或循环。

【讨论】:

    【解决方案2】:

    我已尝试满足您的要求 - 如果以下代码有帮助,请告诉我,

    data_time_filtered = [
        'https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/002/MYD021KM.A2018002.1330.006.2018003152138.hdf',
        'https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/004/MYD021KM.A2018004.1330.006.2018005220236.hdf',
        'https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/006/MYD021KM.A2018006.1330.006.2018007165439.hdf',
        'https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MYD021KM/2018/009/MYD021KM.A2018009.1330.006.2018010190624.hdf']
    
    # combinations of exist & non-exist values
    next0_list = ['/002/', '/004/', '/111/', '/222/']
    data_filtered = list()
    missing_data = list()
    
    # for next0 in next0_list:
    #     index = [data_filtered.append(s) for s in data_time_filtered if next0 in s]
    #     if not index:
    #         missing_data.append(next0)
    
    
    index = [missing_data.append(next0) for next0 in next0_list if
             not [data_filtered.append(s) for s in data_time_filtered if next0 in s]]
    
    print(missing_data)
    print(data_filtered)
    

    【讨论】:

    • 感谢您的努力 :) 检查我在原始问题中的更新。我正在尝试解决当前的问题,但如果我没有得到任何地方,我会检查你的代码
    • Shaun - 请您现在检查一下
    【解决方案3】:

    我不太明白你想用这段代码做什么,但也许这会让你更接近一点。

    index = [data_filtered.append(data_time_filtered[s]) if next0 in s else missing_data.append(next0) for s in data_time_filtered]
    

    【讨论】:

    • 我认为答案相同!!
    • 这样的东西有用吗? if IndexError: missing_data.append(next0) else: data_filtered.append(data_time_filtered[index[0]])。我会建立你建议的答案,如果它有效,我会告诉你。
    • Shaun - 如果在 s 中找不到 next0,则 index 包含 None。这就是它显示错误的原因。
    猜你喜欢
    • 2020-08-27
    • 2020-01-07
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2021-12-20
    • 2023-03-29
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多