python,循环嵌套,函数,if语句

时间:2014-07-04 03:04:20

标签: python list for-loop indexoutofrangeexception

这是一个有点乱码的代码摘录。

上下文是它试图遍历列表,构建,应该看起来像[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也对我的代码的其他问题做出了很好的回应。

1 个答案:

答案 0 :(得分:1)

调用列表列表的特定部分 - 即list [i] [j]

你的问题是正确的,但你的代码却没有。考虑:

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是有效索引,否则它将失败。

在循环中使用if语句

像在其他任何地方一样使用这些:

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采用可迭代(列表)的整数。您正在传递可迭代的迭代次数。

您的某些变量未设置 - 具体为STAIRCASECAPACITYTRAVELTIME