Python 字数统计不起作用

标签 python list file duplicates

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

Train

21street

Train

还有更多。

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

Train 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))

字数统计好像不行,不知道怎么解决。感谢您的帮助。

最佳答案

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

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。在缩进 block 的末尾,文件自动关闭。下面是完整的代码,还有一些注释更改:

# 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

关于Python 字数统计不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47784843/

相关文章:

python - 在 python 中提取 SVM 模型的分类

python - 如何将多个参数列表传递给@click.option

python - RequestsDependencyWarning : urllib3 (1. 25.2) 或 chardet (3.0.4) 与支持的版本不匹配!使固定

java - 循环遍历多个 YAML 文件以查找特定数据

c++ - 使用 fread() 读取 BMP 的文件头

python - 为什么 "browse"方法使用不存在的 ID 返回错误的记录集?

java - 如何删除索引列表中的重复元素?

c# - 使用 linq 对嵌套列表进行分组

python - 通过正则表达式从列表中的字符串中提取数字

c: 返回目录中的所有文件名