循环遍历列表时,您可以使用列表的当前项.例如,如果要将某些项目替换为其他项目,则可以使用:
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']
但是,我希望替换某些值不是基于索引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']
有没有办法实现这个目标?
使用列表理解和enumerate
>>> ['replacement' if a[i+1]=='b' else v for i,v in enumerate(a[:-1])]+[a[-1]] ['replacement', 'b', 'c', 'd', 'e']
代码替换了下一个元素所在的所有元素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
在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']