首页 > 解决方案 > 计算字符串中 Enum 的出现次数

问题描述

我正在尝试计算字符串值中 ENUM 的出现次数,例如

class numbers(Enum): 
   one = 1
   two = 2

string = "121212123324"

string.count(str(numbers.one.value))

将枚举转换回字符串似乎非常不直观 - 有没有更快的方法?

标签: pythonstringenumerate

解决方案


您的解决方案很好,您可以在下面看到 5 种方法的运行时:

from timeit import timeit
from collections import Counter
from enum import Enum

class numbers(Enum): 
    one = 1
    two = 2
    three = 3
    four = 4

def approach1(products):
    return Counter(products)[str(numbers.one.value)]

def approach2(products):
    return products.count(str(numbers.one.value))

def approach3(products):
    lst = list(map(int, products))
    return lst.count(int(numbers.one.value))

def approach4(products):
    cnt = Counter(products)
    return (cnt[str(numbers.one.value)] , str(numbers.two.value) , 
        cnt[str(numbers.three.value)] , str(numbers.four.value))

def approach5(products):
    cnt_o = products.count(str(numbers.one.value))
    cnt_t = products.count(str(numbers.two.value))    
    cnt_h = products.count(str(numbers.three.value))
    cnt_f = products.count(str(numbers.four.value))
    return (cnt_o , cnt_t , cnt_h , cnt_f)


funcs = approach1, approach2, approach3 , approach4, approach5
products = "121212123324"*10000000


for _ in range(3):
    for func in funcs:
        t = timeit(lambda: func(products), number=1)
        print('%.3f s ' % t, func.__name__)
    print()

输出:

6.279 s  approach1
0.140 s  approach2
17.172 s  approach3
6.403 s  approach4
0.491 s  approach5

6.340 s  approach1
0.139 s  approach2
16.049 s  approach3
6.559 s  approach4
0.474 s  approach5

6.245 s  approach1
0.143 s  approach2
15.876 s  approach3
6.172 s  approach4
0.475 s  approach5

推荐阅读