过滤0的嵌套列表

Posted

技术标签:

【中文标题】过滤0的嵌套列表【英文标题】:Filtering a nested list of 0 【发布时间】:2021-07-10 12:41:39 【问题描述】:

我正在尝试过滤嵌套的值列表以删除 0,这样我就可以计算没有 0 的最小值。

data = [[0, 723, 124,],[4084, 208, 32, 4 ], [ 413, 277, 0, 154], [], [211, 132,0, 54]]

我试过了:

for i in data:
   new_values = []
   mins = min((i), default=0)
   if mins == 0:
      new_values = (filter(lambda x: x !=0, data))
print(new_values)

它给了我:

[]
<filter object at 0x040D4130>
[]
[]
[]
[]
<filter object at 0x040D40F0>
[]
[]
[]
[]
<filter object at 0x040D4130>

预期代码:

   data = [[723, 124,],[4084, 208, 32, 4 ], [ 413, 277, 154], [], [211, 132, 54]]

预期输出:

mins = (124, 4,154,0,54)

【问题讨论】:

这段代码的预期输出是什么? [list(filter(lambda x: x !=0, i)) for i in data] 代码为您提供没有 0 值元素的列表 当我尝试它给了我空的 [] 列表时,它上面有过滤器对象,它有完整的列表。 [min(list(filter(lambda x: x !=0, i))) for i in data if len(i)] 补充 @VivekSable 答案 谢谢。我一直忘记数据中 i 的嵌套循环位等。现在我只需要弄清楚当嵌套列表为空 [] 时要在嵌套列表中做什么。我需要它给出一个 0。这样它就会从最小列表中消失。 【参考方案1】:
    我们必须遍历输入列表。 通过过滤器和 lambda 函数从每个输入数据项中删除零值。 link 从非零项中获取最小值,如果没有项则默认为 0,即min((new_i), default=0) 将步骤 3 的结果附加到输出变量,即mins

代码:-

data = [[0, 723, 124,],[4084, 208, 32, 4 ], [ 413, 277, 0, 154], [], [211, 132,0, 54]]
mins = []
for i in data:
    new_i = list(filter(lambda x: x !=0, i))
    mins.append(min((new_i), default=0))
print(mins)

与综合列表相同的代码 -

mins = [ min(filter(lambda x: x !=0, i), default=0)
         for i in data]

【讨论】:

【参考方案2】:

Vivek Sable 答案的一个简单变体是

list(map(lambda x: min((val for val in x if val != 0), default=0), data))

【讨论】:

以上是关于过滤0的嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章

使用过滤器或折叠球拍遍历嵌套列表

如何使用映射或过滤器而不是列表推导过滤特定值的嵌套字典(pythonic 方式)?

CSharp使用另一个列表及其嵌套列表过滤带有LINQ查询的列表

jq streaming - 过滤嵌套列表并保留全局结构

如何使用linq c#优化嵌套循环并从另一个列表中过滤

嵌套的 wordpress 术语列表 - 过滤器