我正在努力使用Python中的一个小程序,它旨在计算文本文件行中特定字符集的出现次数。
例如,如果我想算数字!和' @'从以下几行
hi!
hello@gmail.com
collection!
我期待以下输出:
!;2
@;1
到目前为止,我得到了一个功能代码,但它效率低下,并没有使用Python库的潜力。 我尝试过使用collections.counter,但收效甚微。我找到的效率阻止器是我无法在counter.update()上选择特定的字符集,所有其余的字符也被计算在内。然后我必须过滤我不感兴趣的字符,这会增加另一个循环...... 我也考虑过正则表达式,但在这种情况下我无法看到优势。
这是我现在拥有的功能代码(我能想象的最简单的想法),它在文件的行中查找特殊字符。我想知道是否有人能想出一个更符合Python特色的想法:
def count_special_chars(filename):
special_chars = list('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ')
dict_count = dict(zip(special_chars, [0] * len(special_chars)))
with open(filename) as f:
for passw in f:
for c in passw:
if c in special_chars:
dict_count[c] += 1
return dict_count
感谢您检查
答案 0 :(得分:3)
为什么不统计整个文件?您应该避免为文件的每一行循环遍历字符串。请改用string.count。
from pprint import pprint
# Better coding style: put constant out of the function
SPECIAL_CHARS = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ '
def count_special_chars(filename):
with open(filename) as f:
content = f.read()
return dict([(i, content.count(i)) for i in SPECIAL_CHARS])
pprint(count_special_chars('example.txt'))
示例输出:
{' ': 0,
'!': 2,
'.': 1,
'@': 1,
'[': 0,
'~': 0
# the remaining keys with a value of zero are ignored
...}
答案 1 :(得分:1)
从collections.Counter
中消除额外的计数可能不是很重要,但是如果它困扰你,那么在初始迭代期间这样做:
from collections import Counter
special_chars = '''!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ '''
found_chars = [c for c in open(yourfile).read() if c in special_chars]
counted_chars = Counter(found_chars)
答案 2 :(得分:1)
该程序的重构版本如下:
special_chars = list('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ')
dict_count = defaultdict(int)
with open(filename) as f:
for c in f.read():
dict_count[c] += 1
for c in special_chars:
print('{0};{1}'.format(c, dict_count[c]))
REF。 defaultdict示例:https://docs.python.org/3.4/library/collections.html#defaultdict-examples
答案 3 :(得分:1)
我做了类似这样的事情,你不需要使用计数器库。我用它来计算所有特殊字符,但你可以适应把计数放在字典中。
import re
def countSpecial(passwd):
specialcount = 0
for special in special_chars:
lenght = 0
#print special
lenght = len(re.findall(r'(\%s)' %special , passwd))
if lenght > 0:
#print lenght,special
specialcount = lenght + specialcount
return specialcount