2012-02-20 28 views
0

私はテキストがあり、Pythonで辞書を作成しました。それはキーとしての単語と、そのテキスト中で単語が値として出現した回数とを有する。この辞書は、値フィールドの値が小さい順にソートされます。ここに私のリストのスニペットがあります:Pythonでの辞書操作

[('the\n', 1644), ('and\n', 872), ('to\n', 729), ('a\n', 632), ('she\n', 541), 
('it\n', 530), ('of\n', 514), ('said\n', 462), ('i\n', 410), ('alice\n', 386), 
('in\n', 369), ('you\n', 365), ('was\n', 357), ('that\n', 280), ('as\n', 263), 
('her\n', 248), ('at\n', 212), ('on\n', 193), ('all\n', 182), ('with\n', 181), 
('had\n', 178), ('but\n', 170), ('for\n', 153), ('so\n', 151), ('be\n', 148), 
('not\n', 145), ('very\n', 144), ('what\n', 136), ('this\n', 134), 
('they\n', 130), ('little\n', 128), ('he\n', 120), ('out\n', 117), 
('is\n', 108), ... ] 

私は25の最も頻繁な単語を印刷したいと思います。それはかなり単純で、私はそれをやりました。次の部分は、文字 "f"で始まる25の最も頻繁な単語を印刷することです。これをどのように見つけ出し、25の最も頻繁な単語のリストに追加しますか?

また、すべての単語のランクを追加する必要があります。たとえば、私の辞書では、 "the"はランク1、 "2"などとなります。単語のリストにランクを追加するにはどうすればよいですか?

答えて

2

ただ、リストの内包表記を使用してフィルタ:

f_words = [(word, freq) for (word, freq) in the_list if word.startswith('f')] 

元のリストがソートされているので、この1つはなりますので。その後、ちょうどトップ25を得るためにそれをスライスすることができます:f_words[:25]

+0

これらの文書を1から25までランク付けする場合、どのようにランクをkey:valueのペアのリストに含めることができますか? – Nerd

+0

'enumerate(some_list、1)'を使って(インデックス、要素)のペアを得ることができます。 '1'は開始点を示し、それ以外の場合はゼロから数え始めます。 – tzaman

3

一つの選択肢はitertools.ifilter()itertools.islice()を使用することです:

f_words = islice(ifilter(lambda x: x[0].startswith("f"), words), 25) 
for word, count in f_words: 
    print word.rstrip() 

代わりのifilter()、あなたはまた、ジェネレータ式を使用することができます。

f_words = islice((w for w, c in words if w.startswith("f")), 25) 
for word in f_words: 
    print word.rstrip() 

これらの方法には、リスト全体を最初にフィルタリングする必要がないという利点があります。ループは25語後に停止します。