Python for循环:迭代未完成

时间:2018-08-09 13:02:24

标签: python for-loop

我想使用以下功能来对两个列表的元素进行突变: 如果列表元素以“ U”开头,则应将其更改为“ 1”,否则应将列表元素更改为“ 0”。 这是代码:

def measure(p):
    for x in range(len(p)):
        if p[x][0] == 'U':
            p[x] = 1
        else:
            p[x] = 0
        return p

print measure(['Dave','Sebastian','Katy'])
print measure(['Umika','Umberto'])

正确的结果应该是

[0, 0, 0]
[1, 1]

但是当前代码会产生:

[0, 'Sebastian', 'Katy']
[1, 'Umberto']

似乎迭代在第一个元素之后停止了。我怎么解决这个问题?

5 个答案:

答案 0 :(得分:4)

您的函数在第一个循环后终止,因为您在该循环内无条件返回。将返回值移到循环的外部。

def measure(p):
    for x in range(len(p)):
        if p[x][0] == 'U':
            p[x] = 1
        else:
            p[x] = 0
    return p

print measure(['Dave','Sebastian','Katy'])
print measure(['Umika','Umberto'])

结果:

[0, 0, 0]
[1, 1]

答案 1 :(得分:0)

知道return总是在执行时终止函数。在for循环的第一个循环中,您的函数执行return语句并结束函数measure。这就是为什么仅将p的第一个元素更改为0或1。

只需将return语句放在for循环之外

def measure(p):
    for x in range(len(p)):
        if p[x][0] == 'U':
            p[x] = 1
        else:
            p[x] = 0
    return p

答案 2 :(得分:0)

作为奖励,您的功能非常简单,可以单线制作,如下所示:

def f(L):
    return [1 if elt[0].lower() == "u" else 0 for elt in L]

f(['Umika','Umberto'])
Out[27]: [1, 1]

f(['Dave','Sebastian','Katy'])
Out[28]: [0, 0, 0]

答案 3 :(得分:0)

return语句的标识位于for循环内。这意味着代码仅在修改第一个元素后停止。

将return语句置于与for语句相同的标识级别,并且应该可以工作。

答案 4 :(得分:0)

您的return语句缩进得太远-这就是为什么它在第一个元素之后停止。它应缩进与for x...行相同的级别。试试:

>>> def measure(p):
...     for x in range(len(p)):
...         if p[x][0] == 'U':
...             p[x] = 1
...         else:
...             p[x] = 0
...     return p
...
>>> print measure(['Dave','Sebastian','Katy'])
[0, 0, 0]
>>> print measure(['Umika','Umberto'])
[1, 1]