リストから重複した要素を取り除く
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)) だと順番が保存されないですよね。それを避けたつもりだったんですが、書いてなきゃわからないですね^^