2012-11-22 99 views
0

我有這段代碼,並想知道是否有任何內置的方式來更快地做到這一點?獲取字典的第一個元素而不使用循環

字有一個簡單的標記字符串輸入。

freq_unigrams = nltk.FreqDist(words) 
unigram_list = [] 

count = 0 
for x in freq_unigrams.keys(): 
    unigram_list.append(x) 
    count+=1 
    if count >= 1000: 
     break 
+2

檢查您的縮進 - 它看起來不像是通過正確的複製粘貼。 –

回答

4

是否freq_unigrams.keys()返回一個列表?如果是這樣,怎麼樣以下幾點:

unigram_list = freq_unigrams.keys()[:1000] 

這給你包含freq_unigrams.keys()第1000個元素,沒有循環的列表。

0

**有點晚了......

若要在你的字典第1000項,並將它們分配到一個新的列表:

unigram_list = freq_unigrams.keys()[:1000] 
1

我建議:

unigram_list = freq_unigrams.keys() 
unigram_list[:] = unigram_list[:1000] 

這不會使複製:unigram_list = freq_unigrams.keys()[:1000]

雖然這可能是與迭代器更好:

from itertools import islice 
unigram_list[:] = islice(freq_unigrams.iterkeys(),1000) 
+2

'unigram_list [:1000]'是否生成副本不取決於'='左側的內容。如果unigram_list是一個列表,則切片會創建一個(淺)副本,如果它是一個numpy數組,它可以創建一個視圖(無數據副本)。只有當你想修改列表時,你才需要''unigram_list [:] ='否則'unigram_list ='可能更有效率(它只是綁定名稱來引用副本(通過切分舊副本)。 – jfs

1

如果你的目的是讓在words列表中的前1000個高頻詞,你可以嘗試:

import collections 

# get top words and their frequencies 
most_common = collections.Counter(words).most_common(1000) 
1

這是理論上更高效:

import itertools 
unigram_list = list(itertools.islice(freq_unigrams.iterkeys(), 1000)) 

...比努力工作freq_unigrams.keys(),因爲您只對top 1000感興趣,而不是其餘x,其中使用freq_unigrams.keys()也需要填充在中間list中。