计算一组字符串发生的次数,并在python 2.7中打印字符串和出现次数

时间:2014-11-20 16:52:41

标签: python-2.7 counter

我试图逐行读取文本文件,并检查一行中每组字符串的出现次数,例如。文本文件包含这些行(有所不同)

X_0_Gui_Menu_400_Menu_System
X_0_Gui_Menu_400_Menu_System
X_0_Gui_Menu_000_Menu_root
X_0_Gui_Menu_000_Menu_root
X_0_Gui_Menu_000_Menu_root
X_0_Gui_Menu_300_Menu_Outputs
X_0_Gui_Menu_300_Menu_Outputs
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI

我想获得

的输出
X_0_Gui_Menu_400_Menu_System
2 times

X_0_Gui_Menu_000_Menu_root
3 times

X_0_Gui_Menu_300_Menu_Outputs
2 times

X_0_Gui_Menu_320_Menu_Outputs_SDI
8 times

我看到一些使用count的论坛,但我不知道文件中有哪些数据可以输入要检查,但它完全是随机的。所以我很困惑如何实现这一点。任何指导都会非常有用。

2 个答案:

答案 0 :(得分:0)

file = open('test.txt')
fileLines = file.read().split('\n')
list = []

for line in fileLines :
    for tup in list:
        if tup[0] == line:
                list[list.index(tup)][1] = list[list.index(tup)][1] + 1
                break
    else:
        list.append([line, 1])

for s in list:
    print(s[0] + ' ' + str(s[1]))

这应该读取文件中的行。 如果列中不存在该行,则它会将一个元组添加到由字符串和计数组成的列表中。 如果该行确实存在,那么它只是在适当的元组中将计数加1。

答案 1 :(得分:0)

您可以使用collection module中的Counter容器来实现此目的。从Python文档:"计数器是用于计算可哈希对象的dict子类。它是一个无序集合,其中元素存储为字典键,其计数存储为字典值。计数允许为任何整数值,包括零或负计数。 Counter类与其他语言的包或多重集类似。"

以下示例代码可以满足您的要求。我使用了一个事实,即文件是创建Counter对象的迭代器。当你迭代时,在一个文件上它产生每一行,但不删除换行符,所以我使用strip()方法来获得你建议的输出。

filename = 'test.txt'

filetxt = """\
X_0_Gui_Menu_400_Menu_System
X_0_Gui_Menu_400_Menu_System
X_0_Gui_Menu_000_Menu_root
X_0_Gui_Menu_000_Menu_root
X_0_Gui_Menu_000_Menu_root
X_0_Gui_Menu_300_Menu_Outputs
X_0_Gui_Menu_300_Menu_Outputs
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
X_0_Gui_Menu_320_Menu_Outputs_SDI
"""

with open(filename, 'w') as f:
    f.write(filetxt)

from collections import Counter
with open(filename, 'r') as f:
    c = Counter(f)

# use iteritems() in python 2.7 instead of items
for key, value in c.items():
    print(key.strip())
    print('{:d} times'.format(value))