将文本列表(字符串)转换为python lis

2024-09-30 00:41:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到这个问题已经被问了很多次在这个网站上,但我找不到一个符合我需要的答案。在

我需要做的是将一个非常长的文本文件(68000行)转换成python中的列表。整个文本文件的格式如下所示:

libertarians
liberticidal
liberticide
liberticide's
liberticides

我的最终目标是创建一个系统,用相应的字典值替换单词。例如dic['apple'、'pears'、'peaches'、'cats']。下面的代码不起作用,因为它生成的列表不能用在if-word-in-list:语句中。我试过了。在

^{pr2}$

这是代码的全部内容,它作为检索列表的方法。在

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

简言之,名单可以打印出来,但其他的几乎没有。在


Tags: 答案代码inapple列表if网站格式
2条回答

最简单的方法:

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

68000行意味着几兆字节的距离,这在某些评论中是一种恐怖!-),在任何现代平台上,可用的虚拟内存都是giga字节(如果你在Commodore64上运行Python,那就不同了,但我相信你还有很多其他的问题:-). 在

readlines方法在内部完成了其他方法需要显式执行的换行剥离,因此更可取(而且更快)。如果你需要一个单词列表的结果,无论如何,你也不可能通过零碎的方法来保存任何内存。在

补充道:例如,在我的Macbook Air上

^{pr2}$

所以超过了OP提到的三分之一。在这里

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

所以,有点超过2MB的200k字检查!因此,对于超过60万个单词,我推断出“一点超过6MB”远远地低于这个“勇敢的新世界”中可能导致MemoryError的数量(来自像我这样的老一辈人的观点:-)拥有许多千兆字节的机器(甚至手机,现在……:-)。在

另外,不管怎样,如果这个单词列表被保存为一个单词列表,你不可能花费少于这几兆字节的内存!逐行读取文件,并巧妙地从需要的行子集中保留所需数据的子集,这是“完全错误的努力”,而您的目标实际上是在特定情况下保留每一行中的几乎所有文本(这正好符合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]

您也可以不必存储所有行,而是在运行中执行您的工作:

^{pr2}$

相关问题 更多 >

    热门问题