我想创造一个我认为相当简单的功能。该函数只运行一个列表列表,并返回在第二个1
之后的所有列表元素中没有element ([2: ])
的任何列表。因此,给定列表[[1, 2, 1, 1, 1, 1], [4, 5, 1, 2, 0.3, 1, 1, 1]]
,函数将返回[4, 5, 1, 2, 0.3, 1, 1, 1]
。到目前为止我所拥有的是:
def discover(A):
"""Looks for list that has an element not equal to one.
"""
for i in range(len(A)):
for j in range(len(A[i])):
if A[i][j+2] != 1:
print A[i]
但是当我运行该函数时,它找到一个列表但是然后反复打印该列表,然后给我一个IndexError,表示列表索引超出范围。这似乎是一个相当容易的问题,但由于某种原因,我没有得到它。任何帮助都会非常感激。
答案 0 :(得分:3)
问题在于这两行:
for j in range(len(A[i])):
if A[i][j+2] != 1:
发生的事情是,您最终会到达j
是列表长度减去1的点。但是您要调用j+2
在下面的代码中,保证创建一个比列表更长的数字,为您提供IndexError
。你可以用以下方法解决这个问题:
for j in range(2,len(A[i])):
if A[i][j] != 1:
对于无尽的打印,你几乎就在那里,但是如果找到非1元素,你会想要停止循环。
if A[i][j] != 1:
print A[i]
break
或者,其他答案将更容易为您提供相同的结果。但那是您当前错误的来源。
答案 1 :(得分:0)
检查是否有任何元素(在第二个之后)!= 1的查询将是:
any(x != 1 for x in mylist[3:])
所以
def discover(A):
for mylist in A:
if any(x != 1 for x in mylist[3:]):
print mylist
答案 2 :(得分:0)
for list in A:
if 1 not in list[3:]:
print list
答案 3 :(得分:0)
甚至是另一种解决方案:
lst = [
[1,2,3],
[1,1,1],
[3,4,5],
[3,5,6],
] # +++
def has1(subLst):
return subLst.count(1) == 0
print filter(has1, lst)
答案 4 :(得分:0)
这可以避免超出范围的问题。
def discover(A):
results = []
for lst in A:
for i in lst[3:]:
if i != 1:
results.append(lst)
break
return results
答案 5 :(得分:0)
除了这里的其他答案,还可以使用发电机。 yield
语句允许您设置默认列表以将结果放入;您可以指定您要查找的条件并yield
结果。
>>> def discover(lists):
... for l in lists:
... if not [x for x in l[2:] if x != 1]:
... yield l
>>> stuff = [[2, 3, 4, 5, 1, 2], [2, 5, 1, 1, 1, 1, 1]]
>>> results = discover(stuff) #returns <generator object discover at 0x105e3eb90>
>>> results.next()
[2, 5, 1, 1, 1, 1, 1]
>>>
这里的魔术线是if not [x for x in l[2:] if x !=1]
。它从l[2:]
构建一个列表,并检查其中的任何变量是否等于1;如果列表没有长度,则表示l[2:]
中没有非1个条目,因此它会产生l
。