2014-01-08 46 views
3

我有一個項目列表,我想從中刪除所有類似的值,但第一個和最後一個。例如:從列表中刪除類似項目的pythonic方式

listIn = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1] 
  1. 前三個元素 「1,1,1」 是相似的,所以除去中間的 「1」。
  2. 接下來的兩個零是未修改的。
  3. 一個只是一個。保持不變。
  4. 四個零。刪除第一個和最後一個之間的項目。

,導致:

listOut = [1, 1, 0, 0, 1, 0, 0, 1] 

在C++中這樣做的方式是非常明顯的,但它看起來從Python代碼風格非常不同。或者它是唯一的方法?

基本上,只要在其中「y」的值不改變的圖中移除過多的點: enter image description here

回答

6

使用itertools.groupby(),以便將值:

from itertools import groupby 

listOut = [] 
for value, group in groupby(listIn): 
    listOut.append(next(group)) 
    for i in group: 
     listOut.append(i) 
     break 

,或者用於增加效率,因爲一個發電機:

from itertools import groupby 

def reduced(it): 
    for value, group in groupby(it): 
     yield next(group) 
     for i in group: 
      yield i 
      break 

演示:

>>> listIn = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1] 
>>> list(reduced(listIn)) 
[1, 1, 0, 0, 1, 0, 0, 1] 
+0

itertools的長壽,基本上解決了在其標題中具有'list'的任何問題。 – bgusach

+0

這正是我期望從python和itertools。完美解決方案 –

1

一襯墊:

listOut = reduce(lambda x, y: x if x[-1] == y and x[-2] == y else x + [y], listIn, listIn[0:2]) 
1

這提供了一個numpythonic解決問題的辦法;對於大型數組,應該比基於itertools的快很多。可以說,如果你正在做任何類型的信號處理,那麼有很多理由使用numpy。

import numpy as np 
a = np.array([1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1], np.int) 

change = a[:-1] != a[1:] 
I = np.zeros_like(a, np.bool) 
I[:-1] = change 
I[1:] += change 
print a[I] 
+0

優秀的numpy解決方案。然而,作爲np的新手,我花了一些時間去欣賞它:D –