让我们假设我有一个这样的字符串:
sentence = 'I am 6,571.5 14 a 14 data 1,a211 43.2 scientist 1he3'
我希望将字符串中最频繁出现的频率作为输出。
在上面的字符串中,这是2
,它对应于字符串中最常见的数字14
。
当我说数字时,我的意思是只包含数字和,
或.
的东西,并且用空格分隔。
因此,在唯一的数字上方的字符串是:6,571.5
,14
,14
,43.2
。
(请注意,不同的国家/地区会以相反的方式使用,
和.
来表示小数和千位,因此我要考虑所有这些可能的情况)
如何有效地做到这一点?
PS
有趣的是,发现Python中没有(非常)快速的方法来测试单词是否为数字(包括有关,
和.
的不同约定的整数和浮点数)。
答案 0 :(得分:1)
您可以尝试:
from collections import Counter
import re
pattern = '\s*?\d+[\,\.]\d+[\,\.]\d+\s*?|\s*?\d+[\,\.]\d+\s*?|\s[0-9]+\s'
sentence = 'I am 6,571.5 14 a 14 data 1,a211 43.2 scientist 1he3'
[(_ , freq)] = Counter(re.findall(pattern, sentence)).most_common(1)
print(freq)
# output: 2
或者您可以使用:
def simple(w):
if w.isalpha():
return False
if w.isnumeric():
return True
if w.count('.') > 1 or w.count(',') > 1:
return False
if w.startswith('.') or w.startswith(','):
return False
if w.replace(',', '').replace('.', '').isnumeric():
return True
return False
[(_ , freq)] = Counter([w for w in sentence.split() if simple(w)]).most_common(1)
print(freq)
# output: 2
但是第二种解决方案要慢大约2倍