challenge 重複する要素を取り除く

与えられたリストxsの中から、 2回以上出現するものを全部取り除いてください。

サンプル入力
[3, 1, 4, 1, 5, 9, 2, 6, 5]
サンプル出力
[3, 4, 9, 2, 6]

これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。

Posted feedbacks - Python

速度的には、defaultdict より
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)


	
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]

Index

Feed

Other

Link

Pathtraq

loading...