2011-12-17 5 views
0

単語と出現回数を印刷しようとしています。そのような:リストジェネレータを使用して単語とその発生数のカップルを行う方法は?

a aba aaa 
dd ddd dd 

私のうちSHOLDが含まれています:

[[a,1],[dd,2],[aba ,1],[ddd,1],[aaa,1]] 

が、それは次のとおりです。

:ここ
[[a,1],[dd,2],[aba ,1],[dd,2],[ddd,1],[aaa,1]] 

は完全なコードである1.TXTで

import re 

def get_words_from_string(s): 
    return (re.findall(re.compile('\w+'), s.lower())) 


def merge(seq): 
    merged = [] 
    for s in seq: 
     for x in s: 
      merged.append(x) 
    return merged 


fp1 = open('1.txt' , 'r'); 

set1 = set(line.strip() for line in fp1); 

l1 =[] 
for x in set1: 
    x.split() 
    x = get_words_from_string(x) 
    l1.append(x) 

l1= merge(l1); 

out = [] 
out = [[word , l1.count(word)] for word in l1 if (1 > out.count(word))] 

単語が最初のオカレンスの外に出ていない場合、問題が発生します。 リストに項目が含まれているかどうかを確認する安全な方法はありますか?

+1

それが機能しないと思われる理由を理解してから、結果を含めるように質問を修正してください。 –

+1

このコードを実行すると何が起こりますか? – Blender

答えて

1

とは、輸入品のない解決策が考えられます。

>>> f = open('1.txt', 'r') 
>>> words = f.read().split() 
>>> word_counter = {} 
>>> for word in words: 
... word_counter[word] = word_counter.get(word, 0) + 1 
... 
>>> word_counter 
{'a': 1, 'aba': 1, 'dd': 2, 'aaa': 1, 'ddd': 1} 

word_counterは今、すべての単語のfrequencesとdictです。リストのリストとしてご希望の場合は、リスト内包表記を使用することができます。

>>> word_counter_as_list = [ [k, v] for k, v in word_counter.items() ] 
>>> word_counter_as_list 
[['a', 1], ['aba', 1], ['dd', 2], ['aaa', 1], ['ddd', 1]] 
1

このライン

out = [[word , l1.count(word)] for word in l1 if (not(-1<l1.index(word)))] 

は「-1l1内の単語のインデックスよりも小さくならないように、各単語のリストを数える/単語のリストを作成します」と言います。しかし、-1は常にl1の単語のインデックスよりも小さくなります。これは、インデックスが常に正であるためです。これにより、すべての結果が除外されます。

notを削除すると、これは正常に動作します。しかし、フィルターは完全に無意味です。 indexの結果は常に-1より大きいため、フィルタリングは何も行われません。つまり、wordl1にない場合を除き、例外がスローされます。

あなたのコードをもっと見ると、あまりにも複雑すぎるプログラムが作成されています。あなたが望むことをする3行のプログラムがあります。なぜ、setの行を作成し、それを繰り返し処理していますか?なぜあなたは正規表現を使用していますか?これは私が間違っていると感じるような単純な問題です。しかし、ここでいくつかのヒントがあります:

>>> fp1 = open('1.txt' , 'r'); 
>>> s = fp1.read() 
>>> s 
'a aba aaa\ndd ddd dd\n' 
>>> s.split() 
['a', 'aba', 'aaa', 'dd', 'ddd', 'dd'] 
>>> set(s.split()) 
set(['a', 'aba', 'dd', 'aaa', 'ddd']) 
+0

はい私は間違ったバージョンの質問をアップロードしましたが、今修正しました。もちろんout.indexでなければなりません。もう一度申し訳ありませんが、ここにはWi-Fiに問題があります。ありがとう – 0x90

+0

@ ZoZo123、あなたが投稿した新しいコードはまったく動作しません。リスト内包が実行されている間に 'out'が空のリストであると、' index'は例外をスローします。 – senderle

+0

これは、リストの理解のすべての反復のリスト全体を繰り返します。 –

2
from collections import Counter 

with open("1.txt") as f: 
    words = f.read().split() 

c = Counter(words) 

print [[word,count] for word, count in c.iteritems()] 
0
fp1 = open('1.txt' , 'r'); 
l1 = fp1.read(); 
    set1 = set(l1.split()); 
    for it in set1 : 
     print it, "count = " , l1.count(it); 
関連する問題