Python字数不起作用

时间:2017-12-13 02:58:28

标签: python list file duplicates

Textfile1包含单词,其中一些是重复的:

  

列车

     

21street

     

列车

等等。

我需要计算它们的出现次数并将其写入Textfile2,同时删除重复项。另外,按字母顺序排列,这就是为什么我有sorted的原因。最终Textfile2的外观示例:

  

训练2

     

21street 1

......等等。

这是我的尝试:

file1=open(textfile1,"r")
list1=[]

for line in file1:
    list1.append(line)

import collections

counter=collections.Counter(list1) #not sure how I can use this in my program

list2=list(set(list1))

list3=sorted(list2)

file2=open(textfile2,"w")

for i in list3:

    file2.write(i+count((i)in list1))

单词计数似乎不起作用,我不知道如何解决它。谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

让我们从错误开始逐步进行一些更改。

file2.write(i+count((i)in list1))
#             ^^^^^^^^^^^^^^^^^^ 
# NameError: name 'count' is not defined

问题是您是否错误地访问了计数。 Counter的作用类似于dict;关键是要计算的是什么,值是计数(int)。您为Counter提供了名称counter,因此要访问行i的计数,请将其更改为此,由于其他原因会出错:

file2.write(i+counter[i])
#             ^^^^^^^^^^ 
# TypeError: must be str, not int

即使我们成功获得了计数,我们也无法将其添加到行i,就像这样。线和计数是两种不同的类型;一个是文本(str),另一个是数字(int)。我们需要将该数字转换为其文本表示。如果这让您感到困惑,请将其视为:2 + 2 == 4"2" + "2" == "22"。以下是如何做到这一点:

file2.write(i+str(counter[i]))

不再有错误,但根据您的测试方式,以file2打开的文件可能仍为空。只有在完成后关闭更改,才会将更改写入磁盘。永远不要忘记这样做,您可以使用with语句将簿记留给Python。在缩进块的末尾,文件将自动关闭。下面是完整的代码,其中包含一些注释更改:

# imports at the top
import collections

list1=[]
with open(textfile1,"r") as file1:
    for line in file1:
        list1.append(line)
# file1 automatically closed here
counter=collections.Counter(list1)
list2=list(set(list1))
list3=sorted(list2)
with open(textfile2,"w") as file2:
    # i implies index which it isn't; let's call it line too
    for line in list3:
        file2.write(line+str(counter[line]))
# file2 automatically closed here

运行后,以file2打开的文件将如下所示:

21street
1Train
2

该号码最后在下一行。发生这种情况的原因是,您存储在列表中的行不仅仅是"21street""Train",而是"21street\n""Train\n"。最后的"\n"是换行符,用作行分隔符。如果您在此之后添加任何文本,它将以新行结束 - 这就是重点。在list中,不再需要此类分隔符,因此请将其删除:

        list1.append(line.rstrip("\n"))
        #                ^^^^^^^^^^^^^

现在您的输出将是这样的:

21street1Train2

在再次写入文件时,需要在正确的位置添加分隔符。什么是正确的地方?在一条线的尽头。此外,行和计数之间的空格会很好:

        file2.write(line+" "+str(counter[line])+"\n")
        #               ^^^^                   ^^^^^

最后,输出符合要求:

21street 1
Train 2

答案 1 :(得分:0)

我的解决方案是:

with open('a.txt') as f:
    a = f.read()
a = a.split('\n')
a = [i for i in a if i != '']
from collections import Counter
b = Counter(a)
with open('b.txt', 'w') as f:
    for key in b:
        f.write('{} : {}\n'.format(key, b[key]))

答案 2 :(得分:0)

您应该尝试list而不是dict而不需要导入任何外部模块,只需通过某种逻辑即可:

track={}
with open("file.txt",'r') as f:
    for line in f:

        if line!='\n':

            if line.strip() not in track:
                track[line.strip()]=1
            else:
                track[line.strip()]+=1


with open("new_text",'w') as new:
    for key,value in track.items():
        tr="{} {} \n".format(key,value)
        new.write(tr)

在new_text文件中输出:

Train 2 
21street 1