【问题标题】:Filtering a list in python using a function of other values in the list.使用列表中其他值的函数过滤python中的列表。
【发布时间】:2013-03-05 09:41:23
【问题描述】:
counts = misc. array

    for i in counts:
        if i < "(sum of the two integers next to i)/4"
            return -1

我要做的是将列表中小于两个邻居平均值一半的所有值设置为-1。即对于列表 [10., 20., 10., 25., 30.] 如果 i=3 那么我想看看 10 是否小于 (20+25)/4 并且因为那是 45/4 > 10然后我想将 10 设置为 -1。然后,我将过滤列表中的所有值 >= 0。

这更加复杂,因为您应该从 i+1 开始,因为此过程不适用于第一个值,然后您应该以 -1 结束,因为此过程不适用于最后一个值。任何帮助将不胜感激。

【问题讨论】:

    标签: python list function filter


    【解决方案1】:

    你可以从this answer借用滑动窗口生成器,像这样使用:

    out = [y if y >= (x+z)/4. else -1 for x,y,z in window(l, 3)]
    

    l 是您的列表。

    这会切断第一个和最后一个元素。如果您愿意,可以很容易地做一些与他们不同的事情(例如设置为 -1)。

    【讨论】:

    • 这对刚刚提出第一个问题的用户(new_user_number)有何帮助?并不是说我的答案是最好的……
    【解决方案2】:

    这是否符合您的要求(假设值在列表 data 中)?

    filtered = [data[i] for i in range(1,len(data)-1) if data[i] >= (data[i+1]+data[i-1])/4]
    

    【讨论】:

      【解决方案3】:

      像这样:

      result = [(x+1 if counts[x] > counts[x-1]/counts[x+1]/4 else -1) for x in range(len(counts[1:-1]))]
      

      - x 是计数中的 idex --> for x in range(len(counts[1:-1])
      - x+1 因为我们知道 counts[0] 和 count[-1] 已经出局了。因此,要获得结果,必须调整它
      - if count[x] &gt; counts[x-1]/counts[x+1]/4 else -1 测试,如果结果为真则返回结果,否则返回-1
      注意&gt; 0,它与您想要的相反
      - for x in range(len(counts[1:-1]))
      因为我们知道第一个和最后一个值无关紧要
      - counts[1:-1] 同上,最好使用列表的副本,线程安全

      这应该可行,将为您提供每个索引计数中的有效(!=-1) 和无效(== -1) 结果列表,

      问题是,你还能对结果做些什么?

      您可以测试,例如:(注意结果中的调整 x

       ['N/A'] + [(x if x!= -1 else False) for x in result] + ['N/A']
      

      它会为您提供 False 或 True 结果的计数的镜像

      【讨论】:

        【解决方案4】:

        我有一个看起来不太优雅的解决方案,但我相信它是正确且可以理解的。包含过滤,因此如果 -1 是允许的值,它也将起作用。

        我使用 3 个变量(a、b 和 i)和 3 个标志变量(fa、fb 和 fi)来显示值是否需要包含在结果集中。

        def test(lst):
            a, fa, b, fb, res  = None, False, None, False, []
            for i in lst:
                if a is not None:
                    fi = b < (a + i)/4
                else:
                    fi = True
                if fa:
                    res.append(a)
                a, fa = b, fb
                b, fb = i, fi
            if fa:
                res.append(a)
            res.append(b)
            return res
        
        print(test([10., 20., 10., 25., 30.]))
        => [10.0, 20.0, 25.0, 30.0]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-08
          • 2021-04-05
          • 1970-01-01
          • 1970-01-01
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多