3

我希望下面的代码将 2 附加到列表 'a' 直到它的大小为 10。但是,它并没有按我希望的方式工作。我错过了什么?

a = [1,2]

for ctr in range(0,len(a)):
    print ctr
    if len(a) < 10:
        a.append(2)
4

4 回答 4

4

你只循环两次;len(a)仅评估以创建,而不是在循环的每次迭代range()因此,您最终只会得到一个长度为 4 的列表。

改用while语句:

while len(a) < 10:
    a.append(2)

.extend()使用正确数量的2s:

a.extend([2] * (10 - len(a)))

或使用+=(这是 的简写.extend()):

a += [2] * (10 - len(a))

这两种方法都完全避免了循环。

于 2012-12-22T18:59:41.723 回答
3

range(len(a))在循环开始时评估一次。此时,您的列表有两个项目,因此循环将准确执行两次。

做你想做的事,更好的方法是:

a += [2] * (10 - len(a))

您知道要添加多少项,因此一次添加所有项,而不是循环中一次添加一项。

于 2012-12-22T19:00:04.357 回答
2

只需执行一个 while 循环,直到它达到您想要的大小:

a = [1,2]
while len(a) < 10:
    a.append(2)

问题是您将原始循环基于a. 当它评估时,它只会循环 2 次。while另一方面,循环每次都会继续评估该长度。

于 2012-12-22T18:58:54.970 回答
1

只是为了完整性而采用另一种方法......(并且可能更灵活地从其他可迭代对象中填充值等......)

>>> from itertools import chain, islice, repeat
>>> list(islice(chain(a, repeat(2)), 10))
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
于 2012-12-22T19:04:26.433 回答