-1

我有以下文本:sherlock.txt 我想为其中的每个单词创建一个列表(标点符号是单词的一部分,因此不是单独的元素,例如:'glad.')。我所做的是:

>>> def wordlist(text):
...    input= open(text,'r')
...    data= input.read()
...    input.close()
...    data=data.replace('\n',' ')
...    data=data.replace(chr(13),' ')
...    data=data.replace(chr(9),' ')
...    data=data.split(' ')
...    while '' in data:
...        data.remove('')
...    return data

问题是它返回一个单词列表,但它需要大约。7秒这样做。有没有更快的方法来做到这一点?我知道 while 循环是这里的问题。

4

5 回答 5

7

这不是在做吗?不带参数调用split会在所有空白字符上拆分字符串,从而消除那些''在它们被视为数据的一部分之前给您带来问题的字符。由于您将麻烦地将那些其他空白字符更改为' ',因此您不妨使用内置的默认行为免费获得相同的效果。

def wordlist(text):
    with open(text, "r") as fp:
        data = fp.read().split()
    return data
于 2012-12-11T16:47:46.630 回答
0

为了论证的缘故,我们假设您无法从输入中获取空白字符串。显然,如果你能做到这一点,这是首选的方法。列表推导可以以其他方式删除它们:

data = [word for word in data if word]

if部分已简化,因为空字符串的计算结果为False

于 2012-12-11T17:07:00.040 回答
0

是的,您可以只拆分字符串。

data.split()

它将在空白处拆分并返回一个数组。

拆分文档。

于 2012-12-11T16:48:45.083 回答
0

我相信以下内容可以满足您的需求:

words = list(itertools.chain(*map(str.split, open('sherlock.txt'))))

在我的机器上,这需要 16.5 毫秒。

通过删除对 的调用list(),可以将其转换为生成器,该生成器将在读取单词时返回单词,而不是将所有单词存储在内存中。

以下更简单,更快,但内存效率较低(这可能对较大的输入文件很重要):

words = open('sherlock.txt').read().split()

这大约需要 6.7 毫秒。

于 2012-12-11T16:51:30.707 回答
0

尝试使用split()没有任何参数的函数。您不需要先做任何replace-ing,因为它会在任何空白处拆分。

def wordlist(text):
...    input= open(text,'r')
...    data= input.read().split()
...    input.close()
...    return data
于 2012-12-11T16:52:07.747 回答