mar*_*eau 142
由于下面的循环只修改已经看过的元素,因此可以认为是可接受的:
a = ['a',' b', 'c ', ' d ']
for i, s in enumerate(a):
a[i] = s.strip()
print(a) # -> ['a', 'b', 'c', 'd']
Run Code Online (Sandbox Code Playgroud)
这与以下内容不同:
a[:] = [s.strip() for s in a]
Run Code Online (Sandbox Code Playgroud)
因为它不需要创建临时列表并指定它来替换原始列表,尽管它确实需要更多的索引操作.
警告:虽然您可以通过这种方式修改条目,但您无法更改其中的项目数,list而不会有遇到问题的风险.
这是我的意思的一个例子 - 从这一点删除一个条目搞砸索引:
b = ['a', ' b', 'c ', ' d ']
for i, s in enumerate(b):
if s.strip() != b[i]: # leading or trailing whitespace?
del b[i]
print(b) # -> ['a', 'c '] # WRONG!
Run Code Online (Sandbox Code Playgroud)
(结果是错误的,因为它没有删除它应该拥有的所有项目.)
Ign*_*ams 122
它被认为是糟糕的形式.如果需要保留对列表的现有引用,请使用列表推导,使用切片分配.
a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)
Run Code Online (Sandbox Code Playgroud)
小智 18
还有一个用于循环变体,看起来比使用enumerate()更清晰:
for idx in range(len(list)):
list[idx]=... # set a new value
# some other code which doesn't let you use a list comprehension
Run Code Online (Sandbox Code Playgroud)
ciz*_*ixs 10
只要不更改要添加/删除的元素到列表,在迭代列表时修改每个元素就可以了.
您可以使用列表理解:
l = ['a', ' list', 'of ', ' string ']
l = [item.strip() for item in l]
Run Code Online (Sandbox Code Playgroud)
或者只是做C-stylefor循环:
for index, item in enumerate(l):
l[index] = item.strip()
Run Code Online (Sandbox Code Playgroud)
小智 5
Ignacio Vazquez-Abrams 给出的答案非常好。可以通过这个例子进一步说明。设想:
假设你有:
v = np.array([1,2,3,4])
b = np.array([3,4,6])
for i in [v, b]:
i = i[::-1] # This command does not reverse the string.
print([v,b])
Run Code Online (Sandbox Code Playgroud)
你会得到:
[array([1, 2, 3, 4]), array([3, 4, 6])]
Run Code Online (Sandbox Code Playgroud)
另一方面,如果你这样做:
v = np.array([1,2,3,4])
b = np.array([3,4,6])
for i in [v, b]:
i[:] = i[::-1] # This command reverses the string.
print([v,b])
Run Code Online (Sandbox Code Playgroud)
结果是:
[array([4, 3, 2, 1]), array([6, 4, 3])]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
207657 次 |
| 最近记录: |