リストから重複した要素を取り除く
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]
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の動作さえ知っていれば
そこまで判りにくいというわけでもないかと思います。
list(set(a)) だと順番が保存されないですよね。それを避けたつもりだったんですが、書いてなきゃわからないですね^^