根据值过滤列表中的列表(Python)
你好,我正在尝试写一个函数,这个函数只打印那些不包含零的列表,这些列表是一个列表中的多个列表。下面是我正在处理的列表:
[['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
你把事情搞得比实际需要的要复杂多了。
所以:
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:]]