簡體   English   中英

文本列表(字符串)轉換為一個Python列表

[英]converting a text list (string)to a python list

我看到這個問題已經在這個網站上被問過很多次了,但是我找不到能滿足我需要的答案。

我需要做的是將一個很長的文本文件(68萬行)轉換為python中的列表。 整個文本文件的格式如下所示:

libertarians
liberticidal
liberticide
liberticide's
liberticides

我的最終目標是創建一個系統,在該系統中,我用相應的字典值替換單詞。 例如dic ['apple','pears','peaches','cats']。 下面的代碼不起作用,因為它產生的列表不能用在list:語句中的if詞中。 我嘗試過這個。

with open('thefile.txt') as f:
  thelist = f.readlines()

這就是整個代碼,並以此作為檢索列表的方法。

with open('H:/Dropbox/programming/text compression/list.txt') as f:
 thelist = f.readlines()
word = input()
if word in thelist:
 print("hu")
else:
 print("l")

輸入為“ apple”的輸出:1

簡而言之,可以打印該列表,但僅打印其他內容。

最簡單的方法:

with open('thefile.txt') as f:
    thelist = f.readlines()

在任何可用虛擬內存為千兆字節的現代平台上,680k行意味着幾兆字節- 遠離 MemoryError (在某些注釋中表示的恐怖!-),這是不同的(如果您在Commodore 64上運行Python,則有所不同) ,但是我確定您還有很多其他問題:-)。

readlines方法在內部執行換行,而其他方法需要顯式執行,因此是更可取的(且更快)。 而且,如果您需要將結果作為單詞列表使用,則根本無法通過零碎的方式節省任何內存。

新增:例如,在我的Macbook Air上,

$ wc /usr/share/dict/words
235886  235886 2493109 /usr/share/dict/words

因此,OP所提及的數字的三分之一以上。 這里,

>>> with open('/usr/share/dict/words') as f: wds=f.readlines()
... 
>>> sys.getsizeof(wds)
2115960

因此,超過20萬字的空間超過2MB-檢查! 因此,對於超過600k的單詞,我推斷為“超過6MB”- 大大低於在“勇敢的新世界”中可能導致MemoryError的數量(來自像我這樣的舊玩家的POV :-)數千兆字節的機器(如今甚至是電話 ,... :-)。

另外,無論如何,如果要將該單詞列表保留為單詞列表,那么您花費的內存絕不會少於這些幾兆字節的內存! 逐行讀取文件並巧妙地操作以僅保留所需數據的子集,這是“完全錯位的工作”,這時您的目標是基本上保留每個文本中的幾乎所有文本。單行-在這種情況下(恰好滿足了這個Q的問題!-),只需使用readlines並完成它!-)

補充:對Q的編輯使它很清楚(盡管問題中沒有任何地方!),這些行必須在單詞的右邊包含一些空格,因此需要rstrip 即使這樣,公認的答案也不是最優的。 考慮以下文件i.py

def slow():
    list_of_words = []
    for line in open('/usr/share/dict/words'):
        line = line.rstrip()
        list_of_words.append(line)
    return list_of_words

def fast():
    with open('/usr/share/dict/words') as f:
        wds = [s.rstrip() for s in f] 
    return wds

assert slow() == fast()

最后的assert只是驗證了兩種方法產生相同結果的事實。 現在,在Macbook Air上...:

$ python -mtimeit -s'import i' 'i.slow()'
10 loops, best of 3: 69.6 msec per loop
$ python -mtimeit -s'import i' 'i.fast()'
10 loops, best of 3: 50.2 msec per loop

我們可以看到,接受的答案中的循環方法比列表理解所花的時間多出40%。

嘗試這樣:

with open('file') as f:
    my_list = [x.strip() for x in f]

您還可以隨時存儲所有行,以完成工作:

with open('file') as f:
    for x in f:
        # do your stuff here on x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM