2012-06-24 46 views
0

我正在寫一個python遊戲,我必須定期從單詞列表中抽出一個隨機單詞。當我爲我的遊戲創建原型時,我在其中一個模塊的頂部聲明瞭一個word_list = ['cat','dog','rat','house']十個字。然後我使用choice(word_list)來獲得一個隨機單詞。但是,我必須將這種暫時的破解更改爲更優雅的東西,因爲我需要將單詞列表的大小增加到5,000多個單詞。如果我在當前模塊中這樣做,它會顯得很荒謬。我應該在哪裏申報5000+單詞的列表?

我是否應該將所有這些單詞放在一個平坦的txt文件中,然後從該文件中讀取,因爲我需要單詞?如果是這樣,我最好怎麼做?把每個單詞分開一行,然後讀一個隨機行?我不確定最有效的方法是什麼。

+0

您尚未定義「高效」。高效查找,記憶,尋找時間......什麼? –

回答

4

我把所有的話在一個純文本文件,每行一個:

cat 
dog 
.... 

,只是加載它時,你需要用下面的一行代碼:

word_list = [word.rstrip() for word in open("words.txt","r")] 

請參閱:http://docs.python.org/tutorial/datastructures.html#list-comprehensions

此解決方案更加優雅,因爲它不依賴於任何內置函數。不需要導入模塊。

一定要緩存它,一旦它被加載,你不想每次你需要一個新的單詞加載文件中的單詞,但。

+0

如何關閉文件?我刷了[文件對象](http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects),你的方法被認爲是最優雅的,但它留給我的是如何關閉文件以「釋放任何系統資源」的問題。當python看到一個單行的「open」,它不會將該對象賦值給一個變量時,它本質上是否知道要關閉生成的文件對象?謝謝肖恩! –

+0

如果您使用[with](http://www.python.org/dev/peps/pep-0343/)語句,它會在完成後自動清理(關閉文件):'with open(「words .txt「,」r「)as f:word_list = [word.rstrip()for word in f]' - 但你說我的例子沒有正確關閉文件。 –

3

在啓動時(或至少是行索引)讀取文件中的文字,並根據需要使用。

2

我會創建一個名爲random_words的分離模塊,或者類似的東西,將其隱藏在其中並在接口函數中封裝choice(word_list)

至於從文件加載它們,好吧,因爲無論如何我需要輸入它們,並且最後一個python文件只是一個文本文件,我會在那裏輸入它們,可能每行只有一行以便於維護。

+0

我並不是這個想法的忠實粉絲,單詞列表看起來應該是數據的一部分,而不是代碼的一部分,模糊這兩件事之間的界限通常會導致麻煩。 –

0

您可以將每個單詞存儲在文本文件的單獨一行中,然後使用reader(來自csv模塊)將啓動時的文件加載到列表中。然後,您可以隨機從列表中選擇一個字:

import csv 

FILENAME = 'word_list.txt' 
word_list = [] 

# Open word list and get words 
with open(FILENAME, 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     word_list.append(row) 

即使有五千的話,你不應該去五十千字節的RAM,所以我會認爲這是一個有效的方式來做到這一點。

+3

沒有必要使用'csv'模塊來讀取這樣一個簡單的文件。 '用open(「words.txt」)作爲f:words = [ln.strip()for ln in f]'就足夠了。或者甚至可能是'words = f.read().span()',因爲5000個字不是特別大。 –

+0

5,000字並不多。按現代標準來看,5,000,000並不是那麼重要。在5,000,000,000,你可能應該使用anydbm - 鍵將被整數轉換爲一個字符串,並且值將是你的話。 – user1277476