重複する要素を取り除いだリストと重複する要素だけを取り出したリスト

リストから重複した要素を取り除く

Python には uniq がないらしい。ああ、なんてこった。
というわけで作ってみた。

def uniq(lis):
    r = []
    for i in lis:
        if i not in r:
            r.append(i)
    return r

a = [1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9]

print 'Original: ', a
print 'Uniq: ', uniq(a)

もうちょっときれいにならないかな。reduceでできそうな気がする。

^o^ > python uniq.py
Original:  [1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9]
Uniq:      [1, 2, 3, 4, 5, 6, 7, 8, 9]

リストから重複した要素だけを取り出す

今度は逆に、重複した要素だけを取り出してみる。

def overlup(lis):
    r = []
    def func(x, y):
        if x == y and x not in r:
            r.append(x)
        return y
    reduce(func, lis)
    return r

a = [1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9]

print 'Original: ', a
print 'Overlup: ', overlup(a)
^o^ > python overlup.py
Original:  [1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9]
Overlup:   [1, 4, 7]

「重複する要素を取り除いだリストと重複する要素だけを取り出したリスト」への2件のフィードバック

  1. uniqの方は list(set(a)) とするのがエレガントでしょうね。

    overlupの方は難しいですが敢えてワンライナーで書くなら

    from itertools import groupby
    [x for x,y in groupby(sorted(a)) if len(list(y)) > 1]

    ※ソートされてる前提なら
    [x for x,y in groupby(a) if len(list(y)) > 1]

    ワンライナーですがgroupbyの動作さえ知っていれば
    そこまで判りにくいというわけでもないかと思います。

    1. list(set(a)) だと順番が保存されないですよね。それを避けたつもりだったんですが、書いてなきゃわからないですね^^

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください