我有這段代碼,並想知道是否有任何內置的方式來更快地做到這一點?獲取字典的第一個元素而不使用循環
字有一個簡單的標記字符串輸入。
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
我有這段代碼,並想知道是否有任何內置的方式來更快地做到這一點?獲取字典的第一個元素而不使用循環
字有一個簡單的標記字符串輸入。
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
是否freq_unigrams.keys()
返回一個列表?如果是這樣,怎麼樣以下幾點:
unigram_list = freq_unigrams.keys()[:1000]
這給你包含freq_unigrams.keys()
第1000個元素,沒有循環的列表。
**有點晚了......
若要在你的字典第1000項,並將它們分配到一個新的列表:
unigram_list = freq_unigrams.keys()[:1000]
我建議:
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)
'unigram_list [:1000]'是否生成副本不取決於'='左側的內容。如果unigram_list是一個列表,則切片會創建一個(淺)副本,如果它是一個numpy數組,它可以創建一個視圖(無數據副本)。只有當你想修改列表時,你才需要''unigram_list [:] ='否則'unigram_list ='可能更有效率(它只是綁定名稱來引用副本(通過切分舊副本)。 – jfs
如果你的目的是讓在words
列表中的前1000個高頻詞,你可以嘗試:
import collections
# get top words and their frequencies
most_common = collections.Counter(words).most_common(1000)
這是理論上更高效:
import itertools
unigram_list = list(itertools.islice(freq_unigrams.iterkeys(), 1000))
...比努力工作freq_unigrams.keys()
,因爲您只對top 1000感興趣,而不是其餘x,其中使用freq_unigrams.keys()
也需要填充在中間list
中。
檢查您的縮進 - 它看起來不像是通過正確的複製粘貼。 –