2016-11-20 11 views
0

私は、txtファイルからすべての単語をピックアップし、辞書的に並べ替えるPythonスクリプトを開発しています。ここではスクリプトは次のとおりです。sort()を使用してset()を使用して、重複排除された順序付きリストをPythonで使用できないようにします。

import re 


with open ("test.txt") as f: 
    selectedWords =[] 
    lines = f.readlines() 
    for line in lines: 
     line = re.sub("_", ' ', line) #Different word dellimiters 
     words=re.findall(r"[\w']+", line.lower()) 
     for word in words: 
      if re.search(r"[\d']+", word):#delete invalid words such as h2llo 
       continue 
      else: 
       selectedWords.append(word) 

selectedWords.sort() 
selectedWords=set(selectedWords) 
for i in selectedWords: 
    print i 
f.close() 

例入力は次のとおりです。

to be or not 
to 
be that is 
the q2estion 

と予想される出力は次のとおりです。

be 
is 
not 
or 
that 
the 
to 
+0

ちょうどあなたの質問は何ですか?最後の 'f.close()'は 'with'構造体が終了したときに' f'が閉じられるので、エラーを返しませんか? –

+1

何かをセットに変換すると、フィルタリングされた要素のソートされたリストが必要な場合、要素の順序が失われます。あなたは、セットを作成してそれらをフィルタリングし、次にリストに戻って(注文を維持することができる)、そしてそれをソートしたいと思う! – chatton

+0

今後、http://stackoverflow.com/help/mcveに記載されているように、あなたのリピーターを最小限に抑えるよう努めてください。つまり、ファイルから読み込む代わりに、プログラムでハードコードされたリストを使用して同じ問題が発生する可能性がある場合は、ファイルIOを取り出す必要があります。 (同様に、あらかじめ解析された単語だけを含めることができれば、正規表現の部分を取り除くべきです;など - 疑問のコードは他の誰かがコピー&ペーストして同じ問題を見ることができる最小のものでなければなりません)。 –

答えて

0

あなたに変換するときは、ソートのすべての作業を元に戻すしていますset、リストとは異なり、セットは順序付けされていません。彼らは順序を持たないので、並べ替えられたり、ソートされたりすることはできません。代わりに

# BROKEN 
selectedWords = ['some', 'test', 'data', 'here'] 
selectedWords.sort()    # this becomes moot 
selectedWords=set(selectedWords) # ...because this throws away everything it did. 
for i in selectedWords: 
    print i 

...:

# CORRECT 
selectedWords = ['some', 'test', 'data', 'here'] 
selectedWords=list(set(selectedWords)) 
selectedWords.sort() 
for i in selectedWords: 
    print i 

...または、セットとしてデータ構造を保持しますが、一時的なソートされたバージョンを生成し、印刷すること:

selectedWords = ['some', 'test', 'data', 'here'] 
selectedWords = set(selectedWords) 
for i in sorted(selectedWords): 
    print i 
0

setはソートされていないので、データをソートした後でsetを使用することはできません。 このようにすることができます。

selectedWords=list(set(selectedWords)) 
selectedWords.sort() 
for i in selectedWords: 
    print i 
+0

複数行のブロックを正しくシンタックスハイライトするには、エディタで '{}'ボタンを使用するか、バックティックリテラルではなく各行の前に4つのスペースを入れます。 –

関連する問題