2016-07-16 16 views
0

ソートされたリスト内のすべての要素を印刷しようとしていますが、が一度だけになります。ソートされたリストから一意の数字を印刷する

作品以下の私のコードが、私は良い方法があると確信している:

def print_unique(alist): 
    i = 0 
    for i in range(len(alist)): 
     if i < (len(alist)-1): 
      if alist[i] == alist[i+1]: 
       i+=1 
       if alist[i] == alist[i-1]: 
        i+=1 
      elif alist[i] == alist[i-1]: 
        i+=1  
      else: 
       print alist[i] 
     else: 
      if alist[-1]!= alist[-2]: 
       print alist[-1] 

randomlist= [1,2,3,3,3,4,4,5,6,7,7,7,7,8,8,8,9,11,12,14,42] 
print_unique(randomlist) 

これは

1 
2 
5 
6 
9 
11 
12 
14 
42 

例えばを生成すべての値は1行に1回しか表示されません。

+0

Martijnのコードは非常に効率的ですが、(あなたのコードのように) 'alist'はすでにソートされていると仮定します。 –

+1

@MartijnPieters OPの結果には、重複していない項目のみが含まれます。あまりにも問題がうまく配信されていない悪いです。したがって、偽装へのリンクは実際には問題を解決しません。あなたが提案したソリューションの少し修正された拡張はそれを行います: 'print [k for k、groupbyのg(ランダムリスト)len(list(g))== 1]' –

+0

@MosesKoledoye:そうです、はい。明確な問題陳述書を含めないことによって、全面的に非難する。 –

答えて

-3

あなたはこれで行うことができます。

print (set(YOUR_LIST)) 

か、リストの使用が必要な場合は、この:

print (list(set(YOUR_LIST))) 
-4

セットはユニークなアイテムを含むリストです。配列からセットを作成すると、ユニークなアイテムのみが含まれます:

def print_unique(alist): 
    print set(alist) 

入力リストをソートする必要はありません。

-1

この質問は重複しているようです。

あなたがあなたのリストの順序を保持したくない場合、あなたはあなたがも試すことができ

print list(set(sample_list)) 

を行うことができ、

unique_list = [] 
for i in sample_list: 
    if i not in unique_list: 
     unique_list.append(i) 

EDIT:

すべて印刷するためにはリスト内の要素が連続して表示されるように、これを試すことができます

print '\n'.join([str(i) for i in unique_list]) 

@ martijn-pietersがコメントで述べたように、最初のコードは小さなベンチマークを実行したときの2番目のコードと比べて非常に速いことがわかりました。 10^5要素のリストでは、2番目のコードは63.66秒で完了しましたが、最初のコードではわずか0.2200秒でした。 (random.random()を使用して生成されたリスト上の)

+3

回答はしていないので、重複しているとフラグを立てます。そして、あなたの2番目の解決策は 'unique_list'が何度も何度もスキャンされてメンバーシップをテストするのと同時にO(NK)時間がかかります。 –

+0

私はまだこの答えが好きで、OPはそれから多くを学ぶことができると確信しています – RoadRunner

+0

@ martijn-pieters、ありがとう。しかし、私はそれを私の現在の評判と重複するものとしてマークすることはできません:) –

3

あなたが長い一つの要素ですグループのグループにあなたの入力し、フィルタをitertools.groupby() functionを使用することができます。

from itertools import groupby 

def print_unique(alist): 
    for elem, group in groupby(alist): 
     if sum(1 for _ in group) == 1: # count without building a new list 
      print elem 

またはあなたがそれをしたい場合は、「手動」、トラックあなたがyieldprint文を置き換えると、呼び出し元に印刷を残しておきたいことがあり

def print_unique(alist, _sentinel=object()): 
    last, once = _sentinel, False 
    for elem in alist: 
     if elem == last: 
      once = False 
     else: 
      if once: 
       print last 
      last, once = elem, True 
    if last is not _sentinel and once: 
     print last 

:あなたはそれを見ている場合は、最後の項目が複数回見たと

def filter_unique(alist): 
    for elem, group in groupby(alist): 
     if sum(1 for _ in group) == 1: # count without building a new list 
      yield elem 

for unique in filter_unique(randomlist): 
    print unique 
関連する問題