簡體   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