2015-12-22 96 views
2

在循环列表时,可以使用列表的当前项目。例如,如果要替换与其他某些项目,你可以使用:根据上一个元素增加下一个元素

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

有什么办法可以达到这个目的吗?

回答

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 
7

这是一般都比较好风格不遍历指数在Python。接近这样的问题的常见方法是使用zip(或itertools类似izip_longest)看一次多个值:

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

尝试使用当前元素的索引检查列表中的下一个元素。 更换

if i+1=='b': 

if c[c.index(i)+1]=='b': 
+0

这不是一个非常pythonic的解决方案。 –

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名单和移位列表避免显式指数。