首頁 >後端開發 >Python教學 >Python實作從序列中移除重複項且保持元素間順序不變

Python實作從序列中移除重複項且保持元素間順序不變

不言
不言轉載
2018-10-15 14:15:332505瀏覽

這篇文章帶給大家的內容是關於Python實現從序列中移除重複項且保持元素間順序不變,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1、需求

我們想要移除序列出現的重複元素,但仍然保持剩餘的元素的順序不變。

如果只是想要去重,那麼通常足夠簡單的方法就是建立一個集合:

a=[1,5,4,36,7,8,2,3,5,7]
#结果为:{1, 2, 3, 4, 5, 36, 7, 8}
print(set(a))

#2、解決方案

如果序列中的值是可哈希的(hashable),那麼這個問題可以透過使用集合和生成器輕鬆解決。

如果一個物件是可雜湊的,那麼它的生存期內必須是不可變的,它需要有一個__hash__()方法。整數、浮點數、字串、元素都是不可變的。
def dedupe(items):
    seen=set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

a=[1,2,3,1,9,1,5,10]
print(list(dedupe(a)))

運行結果:

[1, 2, 3, 9, 5, 10]

只有當序列中的元素是可哈希的時候才能這麼做。如果想要在不可雜湊的物件序列中移除重複項,需要上述程式碼稍作修改:

def dedupe(items,key=None):
    seen=set()
    for item in items:
        value=item if key is None else key(item)
        if value not in seen:
            yield item
            seen.add(value)

a=[
    {'x':1,'y':2},
    {'x':1,'y':3},
    {'x':1,'y':4},
    {'x':1,'y':2},
    {'x':1,'y':3},
    {'x':1,'y':1},

]
print(list(dedupe(a,key=lambda d:(d['x'],d['y']))))

print(list(dedupe(a,key=lambda d:d['y'])))

運行結果:

[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 1, 'y': 4}, {'x': 1, 'y': 1}]
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 1, 'y': 4}, {'x': 1, 'y': 1}]

這裡的參數key的作用是指定一個函數用來將序列中的元素轉換為可哈希的類型,那麼做的目的就是為了偵測重複項。

#

以上是Python實作從序列中移除重複項且保持元素間順序不變的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除