2017-02-19 7 views
4

私はPythonを学ぼうとしています。Pythonのリストに一意の値だけを追加してください

単語が既にリストに含まれているかどうかを確認してください。 という単語がリストにない場合は、リストに追加します。

これは私が持っているものです。

fhand = open('romeo.txt') 
output = [] 

for line in fhand: 
    words = line.split() 
    for word in words: 
     if word is not output: 
      output.append(word) 

print sorted(output) 

これは私が得たものです。

['Arise', 'But', 'It', 'Juliet', 'Who', 'already', 'and', 'and', 'and', 'breaks', 'east', 'envious', 'fair', 'grief', 'is', 'is', 'is', 'kill', 'light', 'moon', 'pale', 'sick', 'soft', 'sun', 'sun', 'the', 'the', 'the', 'through', 'what', 'window', 'with', 'yonder']

注重複(および、ある、太陽、など)。

ユニークな値はどのようにして取得できますか?

+3

慣習的なやり方は、チェックする単語の*集合*を維持することです。成長リスト上のそれらの線形走査はすべて、そうでなければ線形アルゴリズムを二次的に劣化させる。 –

答えて

8

これを使用します。ここで

if word not in output: 
     output.append(word) 
6

代わりのis notオペレータは、アイテムがリストにあるかどうかを確認するためにnot in演算子を使用する必要があります。setが多く効率的で使用して、BTW

if word not in output: 

Time complexityを参照してください):

with open('romeo.txt') as fhand: 
    output = set() 
    for line in fhand: 
     words = line.split() 
     output.update(words) 

更新setは元の順序を保持しません。順序を保持するには、補助データ構造としてこのセットを使用します。

output = [] 
seen = set() 
with open('romeo.txt') as fhand: 
    for line in fhand: 
     words = line.split() 
     for word in words: 
      if word not in seen: # faster than `word not in output` 
       seen.add(word) 
       output.append(word) 
+0

ありがとうございます。私は助けに感謝します –

+1

演習では、単語が最初の出現順に並べられたリストが必要です。リストを置き換えることはできません。有用な補助データ構造。 –

+0

@JohnColeman、コメントありがとう。私はそれが重要ではないと思った。なぜなら、OPはコードの最後に 'ソートされた 'ためだ。注文を保存するバージョンを含めるように答えを更新します。 – falsetru

1

は順序を維持しながら削除する重複のthis implementationを使用して、「ワンライナー」です:

def unique(seq): 
    seen = set() 
    seen_add = seen.add 
    return [x for x in seq if not (x in seen or seen_add(x))] 

output = unique([word for line in fhand for word in line.split()]) 

最後の行は、単語のリストにfhandを平らにして、結果のリストにunique()を呼び出します。

関連する問題