我想使用以下功能来对两个列表的元素进行突变: 如果列表元素以“ 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']
似乎迭代在第一个元素之后停止了。我怎么解决这个问题?
答案 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]