重複する要素を取り除く
Posted feedbacks - Python
速度的には、defaultdict より
h[i] = h.get(i, 0) + 1
のようなものを使ったほうが速いんでしょうけど・・・
可読性重視で。
h[i] = h.get(i, 0) + 1
のようなものを使ったほうが速いんでしょうけど・・・
可読性重視で。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import collections
def only_unique(a):
h = collections.defaultdict(int)
for i in a:
h[i] += 1
return [i for i in a if h[i] == 1]
def main():
print only_unique([3, 1, 4, 1, 5, 9, 2, 6, 5])
if __name__ == '__main__':
main()
|
再帰再帰・・・。 pythonで再帰にこだわるのは間違っている気がするが。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def oneces(xs, duplicated=None):
if duplicated is None:
duplicated = []
if len(xs) < 2:
return xs
o = oneces(xs[:-1], duplicated)
if xs[-1] in duplicated:
return o
if xs[-1] in o:
o.remove(xs[-1])
duplicated.append(xs[-1])
return o
return o+xs[-1:]
|
[x for x in xs if xs.count(x) == 1] から、 重複する値が多数あった場合を考えて、ループ回数を減らすために集合を利用。 最後は、 sorted(..., key=xs.index) で元の順番に並べ替え。
1 2 | def only_uniq(xs):
return sorted((x for x in set(xs) if xs.count(x) == 1), key=xs.index)
|
なら、もしかしてこれでいける?
1 2 | def only_uniq(xs):
return sorted(set(xs), key=xs.index)
|
see: Python Performance Tips: ドットを避ける
1 2 3 | def uniq2(target):
counter = target.count
return [v for v in target if counter(v) < 2]
|
#2818の3.0a1版。3.0a1リリース記念。
1 2 3 | >>> L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
>>> sorted({v for v in L if L.count(v) == 1}, key=L.index)
[3, 4, 9, 2, 6]
|





にしお
#3412()
Rating1/1=1.00
これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。
[ reply ]