我正在尝试让我的程序在列表列表上重复操作,直到整个过程中没有零为止。我决定使用每个九十个零的七十个列表(用于迷宫生成器)。
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值范围内缓慢滚动。有没有一种更简单的方法可以让它查看一行中的所有子列表?
答案 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
类型的对象在任何情况下都不等于0
。 in
运算符不会深入到列表的最深层次来确定那里是否有零。
答案 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