2015-12-22 94 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名單和移位列表避免顯式指數。