在上一个元素的基础上增加下一个元素

2020-11-25 10:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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。我已经试了好长时间了,但似乎做不到。我想要这样的东西:

^{pr2}$

有没有办法做到这一点?在

3条回答
网友
1楼 ·

使用list comprehension^{}

>>> ['replacement' if a[i+1]=='b' else v for i,v in enumerate(a[:-1])]+[a[-1]]
['replacement', 'b', 'c', 'd', 'e']

代码将替换下一个元素为b的所有元素。然而,为了处理最后一个索引并防止IndexError,我们只需附加最后一个元素并循环到倒数第二个元素。在


没有列表理解

^{pr2}$
网友
2楼 ·

我想你的帖子里有一个混淆列表索引和列表元素的地方。在您编写的循环中,i将是实际的元素(例如'b'),而不是索引,因此{}没有意义,并将抛出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)。在

如果我这样做,我会做一些类似于其他答案的组合:

^{pr2}$

在这里,我使用了一个列表理解来避免循环,在列表上使用^{}和一个移位的列表来避免显式索引。在

网友
3楼 ·

在Python中不迭代索引通常是更好的方式。解决此类问题的一种常见方法是使用^{}(或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'] 

相关问题