这是一个有点乱码的代码摘录。
上下文是它试图遍历列表,构建,应该看起来像[100,92,87等]。它希望遍历建筑物的每个楼层,然后将该人员(通过递减当前楼层)移动到下一个可用楼梯。
我的问题是嵌套列表和函数中的if语句。这是一个三重打击,我无法理解正确的语法:
调用列表列表的特定部分 - 即list [i] [j]
在循环中使用if语句
嵌套循环
在其他循环中使用循环变量
这是我的代码:
def Evacuate(building):
while sum(building) > 0:
for i in building:
if building[i] > 0:
for j in range(STAIRCASE):
if staircasenetwork[j[i-1]] < CAPACITY:
building[i] -= 1
staircase[i-1] += [TRAVELTIME]
编辑:
我想出了这个问题。建筑物的输入是一个列表。 Staircasenetwork也是一个列表。列表看起来像这样
building = [100,90,101]
staircasenetwork = [[0,0,0],[0,0,0]]
这是一座三层楼的建筑,里面满是人和两个空楼梯。
我做错了是因为我试图写下以下内容:
for i in building:
#I'm skipping or simplifying some specific conditionals for the problem here
for j in staircasenetwork:
building[i] -= 1
staircasenetwork[j][i] += 1
应该采取(i)建筑(我期望[0,1,2])和(j)在楼梯网络(我预期为[0,1])并使用这两个co -ordinates迭代我写的列表。
我忘记的是python通过直接将这些值分配给(i)来遍历列表。
所以,如果我有一个清单:
[100, 90, 101]
我写道:
for i in list:
print i
它将打印:
100
90
101
不
0
1
2
所以我的问题的解决方法是使用范围(len(建筑物)而不是建筑物。
此语句需要构建并首先使用len()将其转换为等于列表构建长度的整数。然后它使用整数并使用range()将其转换为从0到X的数字列表。
基本上:[100,90,101]&gt;&gt; 3>&gt; [0,1,2]
building = [100, 90, 101]
for i in range(len(building)):
print str(range(len(building))) + " " str(building)
将打印:
0 100
1 90
2 101
所以在我第一次尝试时,我使用:
for i in building:
#to call on
building[i]
它首先要做的是查看构建列表中的第一个值,即100.然后它使用该数字来查找构建列表中的第100个数字,该数字不存在,因为该列表仅为3价值观很长。
它试图这样做:
building = [100, 90, 101]
for i in building
>>> first val of building = 100
building[100]
>>> IndexError: list index out of range
>>> Is looking for the 100th number in a 3-number long list
有一些方法可以使用如下语句:
for i, e in enumerate(building):
创建可能如下所示的元组列表:
[(0, 100), (1, 90), (2, 101)]
但我更喜欢使用范围(len(建筑物))方法。这种方法可能无法满足速度的基准,但它成功地教会了我一些关于代码如何工作的东西,它解决了我的小问题。
固定代码为:
for i in range(len(building)):
for j in range(len(staircasenetwork)):
building[i] -= 1
staircasenetwork[j][i] += 1
现在(i)和(j)将是(通过范围(len()))的坐标而不是变量的直接反映。
Lego Stormtrooper也对我的代码的其他问题做出了很好的回应。
答案 0 :(得分:1)
你的问题是正确的,但你的代码却没有。考虑:
x = [ 1 , [2,3] ]
当我们调用x[0]
时,我们得到一个对象,在本例中为整数1
。没什么可做的。
但是,当我们致电x[1]
时,我们会得到一个列表([2,3]
),然后我们就可以对此进行操作,就像x[1][1]
一样,它会给我们3个。
在你的代码中,将其分解为:
staircasenetwork[j[i-1]]
等同于:
x = j[i-1]
staircasenetwork[x]
因此,除非x
是有效索引,否则它将失败。
像在其他任何地方一样使用这些:
for i in range(10):
if i%2 == 1:
print i
只打印低于10的奇数。不多。
同样,这些操作与其他任何地方一样。但您没有正确访问您的项目。在Python中for x in some_list
遍历列表中的 items ,而不是索引。
所以你想要这样的东西:
for floor in building:
if floor > 0:
变量在其块中具有范围,因此:
for i in range(3):
x = i*2
# i and x in scope
for j in range(x):
# i, j, x and y are all in scope
y = i+j+x
print y
# The next line will fail because ONLY y isn't in scope.
# j is in scope, but is set to the final value of j for the above loop.
print i+j+x+y
sum
不是魔法。它不会按照您的想法执行,因为sum
采用可迭代(列表)的整数。您正在传递可迭代的迭代次数。
您的某些变量未设置 - 具体为STAIRCASE
,CAPACITY
和TRAVELTIME