现在我遇到了一个问题:我需要计算每个数字在一个字符串中出现的次数。举例来说:Tran Yen Nhi sn 23 06 2003
应该给予结果:{'0':3 , '2':2 , '3':2 , '6':1}
我通过使用正则表达式或迭代文本完成了它。但我想用另一种方式解决。以下是我的想法:
- 如果我可以使用正则表达式找到该字符串中的所有数字'0',它将为我返回'0'的列表。然后我可以使用
len(list)
来查找它出现的次数 - 与其他数字相同,因此我认为我需要迭代
range (0,10)
中的数字 - 这是我尝试的:
for i in range(0,10):
number = re.findall([i],string)
count = len(number)
dictionary[number] = count
字符串
它得到了traceback:不可哈希类型:如何修复此代码?提前感谢您花时间回答我的问题
3条答案
按热度按时间lfapxunr1#
迭代序列,检查字符是否为数字,并递增字典计数。
字符串
pkbketx92#
你可以用
collections.Counter()
和一个generator comprehension来解决这个问题:字符串
试试看:
型
对于这个简单的任务,正则表达式并不是必需的,但是如果你愿意,你可以用
\d
匹配所有的数字,然后从结果列表中构造一个Counter
:型
注意
re.findall()
的第一个参数不能是列表。也就是说,re.findall([i], string)
是错误背后的罪魁祸首。然而,即使它接受这样的参数,dictionary[number]
也会导致同样的错误,因为number
也是一个列表(re.findall()
总是返回一个列表)。如果你想坚持使用循环而不是
Counter()
,可以使用string.count()
:型
但是,这也将记录计数为0的数字:
型
re.findall()
也是如此:型
c86crjj03#
在你试图以这种特殊的方式做这件事的过程中有三个问题:
[i]
不是re.findall
的有效第一个参数。应为字符串。所以通过str(i)
number
是一个列表,所以dictionary[number]
没有意义。您需要dictionary[i]
。1.您只想在出现次数不为零时进行注册,因此需要一个
if
保护。更正:
字符串
注:通过给出更好的名称,您可以避免第二个问题。因为
number
是一个列表,所以我用复数来命名它。此外,“数字”可以由若干“数字”组成。您在这里的意思是“digit”,因此将列表命名为digits
。当然,这不是最有效的处理方式。可以使用
collections.Counter
:型