根据前一个元素增加下一个元素

时间:2015-12-22 18:28:08

标签: python list for-loop indexing

循环浏览列表时,您可以使用列表的当前项。例如,如果要将某些项目替换为其他项目,可以使用:

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']

有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:7)

使用list comprehensionenumerate

>>> ['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':