如何检查列表中是否包含值?

时间:2018-07-17 02:19:24

标签: python list

我正在尝试让我的程序在列表列表上重复操作,直到整个过程中没有零为止。我决定使用每个九十个零的七十个列表(用于迷宫生成器)。

x=int(input("How many columns?\n"))
y=int(input("How many rows?\n"))
maze=[[0]*x for n in range(y)]

因此,对于输入90和70,应该总共有6300个零。但是,当我使用

while 0 in maze[:]:
    #stuff

...循环不做任何事情立即结束。我也尝试过

while 0 in maze:
    #stuff

就像Python完全忽略了迷宫列表中的六千三百个零中的每个零。我知道一种解决此问题的方法,但是它涉及到每次迭代都要在y值范围内缓慢滚动。有没有一种更简单的方法可以让它查看一行中的所有子列表?

5 个答案:

答案 0 :(得分:5)

any()函数与生成器表达式一起使用:

while any(0 in sublist for sublist in maze):
    # do stuff

答案 1 :(得分:2)

我认为您可以使用numpy数组来执行所需的操作。 in运算符将在列表列表中找不到0,bu可以与numpy一起使用。

最小且可验证的示例:

x = [[0,0,0,1], [1,2,3,1]]
>>> 0 in x
False

np_x = np.array(x)
>>> 0 in np_x
True

为什么0 in x不起作用?

因为x拥有许多list类型的对象,而list类型的对象在任何情况下都不等于0in运算符不会深入到列表的最深层次来确定那里是否有零。

答案 2 :(得分:1)

检查二维矩阵中是否存在0总是要花费O(n * m),这效率很低,尤其是因为循环要迭代很多次。

出于您的目的,我建议您只使用一个计数器,并在循环中的任何操作将0项设置为非0值时就将其递增,这样您就可以将{ {1}}循环:

while

答案 3 :(得分:0)

由于0在布尔值中是False,并且maze中的所有项目都将是数字,因此您可以改用它:

while not all(map(all, maze)):

答案 4 :(得分:0)

如果您的子列表大小不同,Numpy不会将其转换为数组

因此,最好取消列表:

x = [[0,0,0,1], [1,2,3,1,4,3,22,-4]]
x_flat = [val for sublist in x for val in sublist]
0 in x_flat 
>> True