Python:计算字符串中唯一字母的Dict

2024-09-29 22:20:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在某种程度上,我使用python3中的字符串库来解决HarvardX挑战,但我不认为我的解决方案很好。你能想出更简洁的解决办法吗?在

我的代码是:

#writing the 2 strings

alpha = string.ascii_letters

alpha
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

sent = 'She sells seashells on the seashore the seashells she sells are      seashells for sure'
sent
'She sells seashells on the seashore the seashells she sells are seashells for sure'

#WRITING DICT to lookup count alpha string characters within 'She sells(etc)'

mydict_countalpha = {alpha[0]:sent.count(alpha[0]), alpha[1]:sent.count(alpha[1]), alpha[2]:sent.count(alpha[2]), alpha[3]:sent.count(alpha[3]), alpha[4]:sent.count(alpha[4]), alpha[5]:sent.count(alpha[5])}

#result:
mydict_countalpha
{'a': 5, 'b': 0, 'c': 0, 'd': 0, 'e': 16, 'f': 1}

是啊。它计算正确。在

但问题是

alpha字符串的长度52个字符。如果我一行一行地手工写这本词典,我想我会出错的。我怎样才能做得更好?这和迭代有关吗?在

为什么我要问

这是基于HarvardX优秀课程“Using Python for Research”的家庭作业。它是经过评估的,但是根据HarvardX的指导,咨询堆栈溢出来确定它是可以的。:—)如果你有什么想法,我不会问你作弊。在

我认为这个挑战有着非常广泛的应用,希望你也觉得有趣。但是,我是一个初学者,对Python的学习曲线非常陡峭。不过,谢谢你的建议!在

最佳

A


Tags: the字符串alphaforstringoncountare
3条回答

简单地查看sent中的每个字母并每次递增该字母的计数似乎要容易得多。在

my_dict = {}

for lett in sent:
    if lett in my_dict:
        my_dict[lett] += 1
    else:
        # first entry
        my_dict[lett] = 1

或者更简单地说,使用dict.setdefault

^{pr2}$

但是请注意stdlib模块collections有一个名为Counter的对象,它正是这样做的。在

from collections import Counter

my_dict = Counter(sent)

在用filter计数之前,可以进一步过滤掉不需要的字母

alpha = set(string.ascii_letters)

filtered = filter(lambda ch: ch in alpha, sent)

my_dict = Counter(filtered)

python方法是通过字典理解使用collections.Counter和{}的过滤键。为了提高效率,可以先将ascii_letters转换为set

from collections import Counter
from string import ascii_letters

letters_set = set(ascii_letters)

res = {k: v for k, v in Counter(sent).items() if k in letters_set}

print(res)

{'S': 1, 'h': 8, 'e': 16, 's': 17, 'l': 10, 'a': 5,
 'o': 3, 'n': 1, 't': 2, 'r': 4, 'f': 1, 'u': 1}

此解决方案具有O(m+n)复杂性,而您当前的解决方案具有复杂度O(m*n)。通过理解str.count,就像list.count,具有O(n)复杂度,也就是说,字典理解中的每次迭代都需要对字符串进行完整的解析。在

你可以用听写理解

mydict_countalpha = {alpha[x]:sent.count(alpha[x]) for x in range(len(alpha))}

但没有必要一直查指数。直接循环alpha

^{pr2}$

不过,我通常的做法是使用集合。计数器在

from collections import Counter
mydict_countalpha = {k: v for k, v in Counter(sent).items() if k in alpha}

编辑:为循环版本添加

mydict_countalpha = {}
for ch in alpha:
    mydict_countalpha[ch] = sent.count(ch)

相关问题 更多 >

    热门问题