返回没有1的列表

时间:2014-07-18 16:09:57

标签: python list

我想创造一个我认为相当简单的功能。该函数只运行一个列表列表,并返回在第二个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,表示列表索引超出范围。这似乎是一个相当容易的问题,但由于某种原因,我没有得到它。任何帮助都会非常感激。

6 个答案:

答案 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