【问题标题】:Python data[i] to data[i+100] < # (eg. 50)Python data[i] to data[i+100] < # (eg. 50)
【发布时间】:2017-06-18 16:42:30
【问题描述】:

我有一个包含大量数据的列表。如果我想将 if 语句设置为下面的伪代码:

if data[i] to data[i+100] < 50:
    data[i] == 1

有什么方法我不需要像下面这样输入吗?

data[i] <50 and data[i+1] <50 and data[i+2] <50 and .... and data[i+100] <50: 

因为这太耗时了。如果有人知道更快的方法,请告诉我。赞赏!!

【问题讨论】:

    标签: python list inequality


    【解决方案1】:

    是的,您可以使用all(..) 在列表的切片 上:

    if all(x < 50 for x in data[i:i+101]):
        data[i] = 1 # probably you want assignment?
    

    您必须将i:i+101 写为切片(而不是i:i+100),因为上限是独占

    或者您可以使用range(..) 并节省制作列表的切片副本:

    if all(data[j] < 50 for j in range(i,i+101)):
        data[i] = 1 # probably you want assignment?
    

    请注意,尽管您没有单独键入所有这些条件,但 Python 当然仍会执行迭代(并计算 最多 101 个这样的表达式)。

    【讨论】:

      【解决方案2】:

      是的。

      if all(data[i+k] < 50 for k in range(0,101)):
      

      【讨论】:

        【解决方案3】:

        当然。您可以map 超过值,检查您的要求,然后可以使用all 来确保它们满足它:

        >>> data = range(1000)
        >>> all(map(lambda i: i < 50, data[:100]))
        # => True
        

        分解发生的事情:

        • data[:101] 获取数组中前 101 项的切片
        • map 遍历这些项目,如果通过了我们的检查 i &lt; 50,则返回一个布尔值。 IE。结果列表是[True, True, True, ...]
        • all 然后检查每个值是否为真

        然后你可以用一些智能切片替换项目:

        if all(map(lambda i: i < 50, data[:100])):
             data = [1] * 100 + data[100:]
        

        【讨论】:

          猜你喜欢
          • 2022-12-02
          • 2022-12-01
          • 2016-07-20
          • 2022-12-28
          • 1970-01-01
          • 2022-12-02
          • 2022-12-02
          • 2022-11-09
          • 2011-06-14
          相关资源
          最近更新 更多