1 9 刪除序列相同元素並保持順序

2021-10-24 11:43:38 字數 1795 閱讀 1214

怎樣在乙個序列上面保持元素順序的同時消除重複的值?

如果序列上的值都是hashable型別,那麼可以很簡單的利用集合或者生成器來解決這個問題。比如:

def

dedupe

(items)

: seen =

set(

)for item in items:

if item not

in seen:

yield item

seen.add(item)

下面是使用上述函式的例子:

>>

> a =[1

,5,2

,1,9

,1,5

,10]>>

>

list

(dedupe(a))[

1,5,

2,9,

10]>>

>

這個方法僅僅在序列中元素為hashable的時候才管用。

如果你想消除元素不可雜湊(比如dict型別)的序列中重複元素的話,你需要將上述**稍微改變一下,就像這樣:

def

dedupe

(items, key=

none):

seen =

set(

)for item in items:

val = item if key is

none

else key(item)

if val not

in seen:

yield item

seen.add(val)

這裡的key引數指定了乙個函式,將序列元素轉換成hashable型別。下面是它的用法示例:

>>

> a =[,

,,]>>

>

list

(dedupe(a, key=

lambda d:

(d['x'

],d[

'y']))

)[,,

]>>

>

list

(dedupe(a, key=

lambda d: d[

'x']))

[,]>>

>

如果你想基於單個字段、屬性或者某個更大的資料結構來消除重複元素,第二種方案同樣可以勝任。

如果你僅僅就是想消除重複元素,通常可以簡單的構造乙個集合。比如:

>>

> a[1

,5,2

,1,9

,1,5

,10]>>

>

set(a)

>>

>

然而,這種方法不能維護元素的順序,生成的結果中的元素位置被打亂。而上面的方法可以避免這種情況。

在本節中我們使用了生成器函式讓我們的函式更加通用,不僅僅是侷限於列表處理。

比如,如果你想讀取乙個檔案,消除重複行,你可以很容易像這樣做:

with

open

(somefile,

'r')

as f:

for line in dedupe(f):.

..

上述key函式引數模仿了sorted(),min()max()等內建函式的相似功能。

刪除序列相同元素並保持順序

怎樣在乙個序列上面保持元素順序的同時消除重複的值?如果序列上的值都是 hashable 型別,那麼可以很簡單的利用集合或者生成器來解 決這個問題。比如 def dedupe items seen set for item in items if item not in seen yield item...

刪除順序錶值相同的多餘元素

編寫演算法,在順序表l中,刪除所有值相等的多餘元素。函式介面定義 void delsame seqlist l l 指向順序表。裁判測試程式樣例 include define maxsize 20 struct seqlist typedef struct seqlist seqlist 型別定義 ...

刪除順序錶值相同的多餘元素

編寫演算法,在順序表l中,刪除所有值相等的多餘元素。函式介面定義 void delsame seqlist l l 指向順序表。裁判測試程式樣例 include define maxsize 20 struct seqlist typedef struct seqlist seqlist 型別定義 ...