根据值过滤列表中的列表(Python)

1 投票
4 回答
1397 浏览
提问于 2025-04-18 13:59

你好,我正在尝试写一个函数,这个函数只打印那些不包含零的列表,这些列表是一个列表中的多个列表。下面是我正在处理的列表:

[['10011.0', ' 65301.0', ' 0.085', ' 0.0', ' 0.0', ' 0.0', ' 0.03', ' 0.03', ' 0.075',
 ' 0.05', ' 0.065', ' 0.05', ' 0.05', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0'],
 ['10017.0', ' 2743.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.2', ' 0.413333', ' 0.415', ' 0.3125', ' 0.45', ' 0.46', ' 0.55'],
 ['10017.0', ' 9262.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.35', ' 0.69', ' 0.675', ' 0.8075', ' 0.8075', ' 0.5325', ' 0.785'], 
 ['10017.0', ' 29319.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0225', ' 0.06', ' 0.0575', ' 0.105', ' 0.1', ' 0.045', ' 0.0'],
 ['10017.0', ' 43562.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.0', ' 0.106667', ' 0.0925', ' 0.09', ' 0.1', ' 0.09', ' 0.1025'],
 ['10017.0', ' 43563.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 0.106667', ' 0.0925', ' 0.09', ' 0.1', ' 0.09', ' 0.1028']]

我运行的代码是:

def no_zero(A):
for i in range(len(A)):
    for j in range(2, (len(A[i])+1)):
        if '0.0' not in A[i]:
            print A[i]
            break

但不知为什么,它没有过滤任何列表,还是打印出了整个列表,尽管我有一个条件:“if '0.0' not in A[i]:”。我不太确定我的错误在哪里,因为逻辑看起来应该很简单。谢谢大家的帮助!

4 个回答

0

如果 A 是你的一个列表,里面包含了多个子列表,那么你可以用 filter(all, A) 来筛选这些子列表。

1

新手尝试。这段代码是用来测试一个值是否为0的。

其中,l 是你要检查的列表。

for i in l:
    a=[]
    for j in i[2:]:
        if float(j)==0:
          break
    else:
        a.append(i)
1

你把事情搞得比实际需要的要复杂多了。

  1. 在Python中,列表的索引通常是不必要的;可以用循环来代替。
  2. 当你的数据中有空格,比如说是 ' 0.0' 时,测试字符串是否等于 '0.0' 会很麻烦。
  3. 列表推导式内置函数是你的好帮手。

所以:

 def no_zeros(rows):
    """Takes a list of rows, prints each row if and only if it has no zeros."""
    for row in rows:
        # skip first two elements of row, per specification
        tests = [float(x) != 0 for x in row[2:]]
        if all(tests):
            print row

结果是:

>>> no_zeros(A)
['10017.0', ' 43563.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 1.0', 
 ' 1.0', ' 1.0', ' 1.0', ' 1.0', ' 0.106667', ' 0.0925', ' 0.09', ' 0.1', 
 ' 0.09', ' 0.1028']
3

通常,当你想要筛选一堆物品时,我们会用一种叫做列表推导的方式,配合筛选条件,来得到一个新的列表。所以在你的情况下,可以这样做:

[c_list for c_list in list_of_lists if '0.0' not in c_list]

这样做会得到所有不包含 0.0 的列表。如果你想跳过前两个元素,从第三个元素开始检查,可以这样做:

[c_list for c_list in list_of_lists if '0.0' not in c_list[2:]]

撰写回答