簡體   English   中英

從列表中刪除類似項目的pythonic方法

[英]pythonic way of removing similar items from list

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

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”值未更改的過多點: 在此輸入圖像描述

使用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]

一內膽:

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

這為問題提供了一個小小的解決方案; 對於大型數組而言,它應該比基於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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM