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

时间:2014-11-28 09:31:27

标签: 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次访问

对这个问题有一些指导会很棒。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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