繁体   English   中英

计算python中字符串出现的次数

[英]Counting number of occurance of a string in python

这个问题是基于这里提供的答案1

我想计算文本文件中字符串出现的次数,借助上面链接的帖子,我提出了以下建议。 但是在某些情况下,它并非每次都能正常运行。

编码:

def counter(filename):
    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.iteritems():
        print("   > " + key.strip() + ': \033[1m\033[32m{:d} visit\033[0m'.format(value))

此数据工作正常

X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays
X_0_Gui_Menu_3231_Menu_Outputs_SDI_status
X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays
X_0_Gui_Menu_321_Menu_Outputs_SDI_processing
X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays
X_0_Gui_Menu_3231_Menu_Outputs_SDI_status 

产生如下输出:

X_0_Gui_Menu_3231_Menu_Outputs_SDI_status:2次访问X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays:3次访问X_0_Gui_Menu_321_Menu_Outputs_SDI_processing:1次访问

但是对于以下输入它无法正常工作

"StatusInfoSet (2, 12)"
"StatusInfoSet (2, 44)"
"CenterMark (2, 2)"
"FrameSet (2, 0)"
"FrameSet (2, 1)"
"FrameSet (2, 0)"
"CenterMark (2, 1)"
"StatusInfo (2, 1)"
"StatusInfo (2, 0)"
"SurroundMask (2, 2)"
MediaCodec (3)
SetSensorFormat (1)
UserSwitchSet (99)
SetExIndex (10)
SetExIndex (11)
"EiSwitchAssign (1, 11)"
Hello
Hello
Hello
Hello
Hello

产生的输出是:

   > Hello: 1 visit
   > Hello: 4 visit
   > SetSensorFormat: 1 visit
   > SetExIndex: 2 visit
   > : 1 visit
   > StatusInfoSet: 2 visit
   > SurroundMask: 1 visit
   > UserSwitchSet: 1 visit
   > EiSwitchAssign: 1 visit
   > MediaCodec: 1 visit
   > FrameSet: 3 visit
   > StatusInfo: 2 visit
   > CenterMark: 2 visit

这不完全是我想要的工作方式。 如您所见,尽管计数正确,但两次提到“ Hello ,但也没有数据访问1次。

我还希望代码将访问量从高到低排列在顶部,例如:

X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays:3次访问X_0_Gui_Menu_3231_Menu_Outputs_SDI_status:2次访问X_0_Gui_Menu_321_Menu_Outputs_SDI_processing:1次访问

对此问题有一些指导将是很棒的。

计数之前,您需要删除输入的项目; 对生成器表达式中的行进行预处理以去除空格:

with open(filename, 'r') as f:
    c = Counter(line.strip() for line in f if line.strip())

我也跳过了行。 可以扩展它以提取您想要计算的更详细的信息。

最高到最低的排序很容易; 只需使用Counter.most_common()方法

for key, value in c.most_common():
    print("   > {}: \033[1m\033[32m{:d} visit\033[0m'.format(key, value))

这将返回从最高到最低排序的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM