循环浏览列表时,您可以使用列表的当前项。例如,如果要将某些项目替换为其他项目,可以使用:
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']
有没有办法实现这个目标?
答案 0 :(得分:7)
使用list comprehension和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
答案 1 :(得分:7)
在Python中不迭代索引通常会有更好的风格。解决此类问题的常用方法是使用zip
(或 {
"First Name": "John",
"LastName": "Smith"
},
{
"First Name": "Jane",
"Last Name": "Doe"
}
中的类似izip_longest
)一次查看多个值:
itertools
答案 2 :(得分:3)
我认为您的帖子在列表索引和列表元素之间存在混淆。在你编写的循环中,i
将是实际的元素(例如'b'
)而不是索引,因此i+1
没有意义,并且会抛出TypeError
异常。
我认为您可以对您的示例进行的一组最小的更改是:
c = ['a', 'b', 'c', 'd', 'e']
d = []
for i, el in enumerate(c[:-1]):
if c[i + 1] == 'b':
d.append('replacement')
else:
d.append(el)
print d
# Output...
# ['replacement', 'b', 'c', 'd']
此外,未定义如何处理边界。特别是当i
指向最后一个元素'e'
时,i+1
指向什么?这里有很多可能的答案。在上面的例子中,我选择了一个选项,即尽早结束迭代一个元素(所以我们永远不会指向最后一个元素e
)。
如果我这样做,我会做类似于其他答案的组合:
c = ['a', 'b', 'c', 'd', 'e']
d = ['replacement' if next == 'b' else current
for current, next in zip(c[:-1], c[1:]) ]
print d
# Output...
# ['replacement', 'b', 'c', 'd']
我使用列表推导来避免循环,并使用列表中的zip
和移位列表来避免显式索引。
答案 3 :(得分:0)
尝试使用当前元素的索引来检查列表中的下一个元素。 替换
if i+1=='b':
与
if c[c.index(i)+1]=='b':