【问题标题】:List comprehension inside a list comprehension with comparison condition具有比较条件的列表推导中的列表推导
【发布时间】:2020-04-07 01:17:30
【问题描述】:

我有一个这样的列表,

 sl=[[1,2,100],[2,100,4],[100,4,5],[4,5,6],[5,6,200],[6,200,7],[200,7,8],[7,8,300],[8,300,9]]

现在我想找到那些元素大于平均值的元素并将其存储到一个列表中。

所以,列表看起来像,

  [[100],[100],[100],[],[200],[200],[200],[300]]

我可以用for循环来做,代码如下,

indices=[]
for i in sl:
    indices.append([j for j in i if (j>(np.mean(i))])

但是执行时间长。我想使用 for 循环并使用某种列表理解来完成相同的任务。

有什么方法可以最有效地缩短执行时间?

【问题讨论】:

  • 对于原始列表中的列表[4,5,6],我认为您应该期望输出中的列表[6]
  • 发布的解决方案是否对您有用?

标签: python list numpy list-comprehension


【解决方案1】:

您应该在每个循环中只计算一次平均值。这应该会有所改善:

indices = []
for i in sl:
  mean = np.mean(i)
  indices.append([j for j in i if j > mean])

我认为将整个内容转换为嵌套列表推导式不会有帮助,因为我们想在最内层循环之外提取均值计算。

【讨论】:

    【解决方案2】:

    您可以在一个列表理解中包含所有内容,避免 for 循环,获得一些性能:

    means = map(np.mean, sl)
    indices = [list(filter(lambda x: x > m, l)) for l, m in zip(sl, means)]
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • 我的答案怎么不是问题的答案?
    • 因为“你可以尝试”的答案更适合作为评论。答案需要有关您的答案将如何解决问题的信息,以及至少有关代码实际执行的一些信息。对于普通读者来说,他们可能根本不知道您的代码要做什么。
    【解决方案3】:

    对于规则形状的列表,即在内部嵌套级别每个列表的元素数量相同,我们可以使用 NumPy 工具来卸载计算部分,就像这样 -

    a = np.array(sl)
    m = a>a.mean(1,keepdims=True)
    idx = np.r_[0,m.sum(1).cumsum()]
    f = a[m].tolist()
    out = [f[i:j] for (i,j)in zip(idx[:-1],idx[1:])]
    

    这将有利于sl 中的大量条目,即对于较大的len(sl)

    【讨论】:

      【解决方案4】:

      你也可以这样做:

      sl=[[1,2,100],[2,100,4],[100,4,5],[4,5,6],[5,6,200],[6,200,7],[200,7,8],[7,8,300],[8,300,9]]
      
      sl = np.array(sl)
      
      # List of elements satisfying the condition
      elem_list = [sl[i][m].tolist() for i,m in enumerate((sl.T>sl.mean(axis=1)).T)]
      
      # List of index for which the respective elements satisfy the condition
      index_list = [np.where(m)[0].tolist() for m in (sl.T>sl.mean(axis=1)).T]
      

      结果:

      elem_list
      [[100], [100], [100], [6], [200], [200], [200], [300], [300]]
      
      index_list
      [[2], [1], [0], [2], [2], [1], [0], [2], [1]]
      

      【讨论】:

        猜你喜欢
        • 2017-12-23
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2016-02-13
        • 2012-05-04
        • 2012-04-21
        相关资源
        最近更新 更多