2012-02-21 9 views
0

重複した項目を削除して並べ替えるだけです。私はすべてのアイテムの1つのインスタンスを削除し、そのアイテムを含む新しいリストを返す必要があります。これは私が持っているものです。すべての値の1つのインスタンスが削除されたリストのコピーを返します。

def rem(nlst): 
    n = [] 
    for x in nlst: 
     if x not in n: 
      n.append(x) 
      n.sort() 
    return n 

これは、それが何をすべきかです:され、2.7以前のPythonのバージョンでは

def rem(iterable): 
    c = collections.Counter(iterable) 
    for k in c: 
     c[k] -= 1 
    return sorted(c.elements()) 

collections.Counter:簡単な実装はcollections.Counterを使用することです

>>> rem([4]) 
[] 
>>> rem([4,4]) 
[4] 
>>> rem([4, 1, 3, 2]) 
[] 
>>> rem([2, 4, 2, 4, 4]) 
[2, 4, 4] 
+0

はスヴェンありがとう、あなたの答えは私が必要なものだけを提供し、あなたはかなり迅速に対応あまりにも! – AngelE

答えて

3

利用不可。あなたは既に代わりに見たアイテムを記録するためにセットを使用することができます。

def rem(iterable): 
    result = [] 
    seen = set() 
    for x in iterable: 
     if x in seen: 
      result.append(x) 
     else: 
      seen.add(x) 
    result.sort() 
    return result 
+0

ああ...カウンター!素晴らしい使い方。 – sberry

0
y = x[:] 
for r in set(x): 
    y.remove(r) 
+0

これはかなり簡潔ですが、O(n^2)なのでこの実装は避けました。 –

+0

私は通常、高速性能が明示的に要件として指定されていない限り、シンプルな、pythonicの解決策を探します。 – wim

0

あなたのコードに若干の微調整がOKに動作するようです。ただ、現在の値を追跡し、すでにその価値を見ている場合のみ、新しいものを追加する変数を追加しました:

def rem(nlist): 
    n = [] 
    nlist.sort() 
    cur = None 
    for x in nlist: 
     if x == cur: 
      n.append(x) 

     cur = x 

    return n 

関連する問題