怎樣在乙個序列上面保持元素順序的同時消除重複的值?
如果序列上的值都是 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() 等內建函式的相似功能 1 9 刪除序列相同元素並保持順序
怎樣在乙個序列上面保持元素順序的同時消除重複的值?如果序列上的值都是hashable型別,那麼可以很簡單的利用集合或者生成器來解決這個問題。比如 def dedupe items seen set for item in items if item not in seen yield item se...
刪除順序錶值相同的多餘元素
編寫演算法,在順序表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 型別定義 ...