San*_*der 2 python indexing for-loop list
循环遍历列表时,您可以使用列表的当前项.例如,如果要将某些项目替换为其他项目,则可以使用:
a=['a','b','c','d','e']
b=[]
for i in a:
if i=='b':
b.append('replacement')
else:
b.append(i)
print b
['a', 'replacement', 'c', 'd', 'e']
Run Code Online (Sandbox Code Playgroud)
但是,我希望替换某些值不是基于索引i,而是基于索引i+1.我已经尝试了很多年,我似乎无法使它工作.我想要这样的东西:
c=['a','b','c','d','e']
d=[]
for i in c:
if i+1=='b':
d.append('replacement')
else:
d.append(i)
print d
d=['replacement','b','c','d','e']
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
>>> ['replacement' if a[i+1]=='b' else v for i,v in enumerate(a[:-1])]+[a[-1]]
['replacement', 'b', 'c', 'd', 'e']
Run Code Online (Sandbox Code Playgroud)
代码替换了下一个元素所在的所有元素b.但是为了处理最后一个索引并防止IndexError,我们只是追加最后一个元素并循环直到倒数第二个元素.
没有列表理解
a=['a','b','c','d','e']
d=[]
for i,v in enumerate(a[:-1]):
if a[i+1]=='b':
d.append('replacement')
else:
d.append(v)
d.append(a[-1])
print d
Run Code Online (Sandbox Code Playgroud)
在Python中不迭代索引通常是更好的风格.解决此类问题的常用方法是使用zip(或类似izip_longest的itertools)一次查看多个值:
In [32]: from itertools import izip_longest
In [33]: a=['a','b','c','d','e']
In [34]: b = []
In [35]: for c, next in izip_longest(a, a[1:]):
....: if next == 'd':
....: b.append("replacement")
....: else:
....: b.append(c)
....:
In [36]: b
Out[36]: ['a', 'b', 'replacement', 'd', 'e']
Run Code Online (Sandbox Code Playgroud)