Python:用于计算字符串中唯一字母的字典

时间:2018-08-23 17:45:04

标签: python string python-3.x dictionary

在某种程度上,我正在使用Python 3中的String库来解决这一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}

是的。它计数正确。

虽然有问题

字母字符串长度为 52个字符。如果我手动逐行手动编写此词典,我会犯错。我该如何做得更好?与迭代有关吗?

我为什么要问

这是基于出色的HarvardX课程“ Using Python for Research”的作业分配。经过评估,但根据HarvardX的指导,咨询Stack Overflow可以解决问题。 :-)我不是在问你有什么主意。

我认为这项挑战的应用非常广泛,希望您也发现它很有趣。但是,我是一名初学者,对Python的学习非常困难。不过,谢谢您的任何建议!

最佳

A

5 个答案:

答案 0 :(得分:3)

Python的方法是使用collections.Counter并通过字典理解来过滤ascii_letters的键。为了提高效率,您可以先将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 < / em>)。您可以通过理解str.countlist.count一样具有O(n)复杂性来理解这一点,即字典理解中的每个迭代都需要对字符串进行完整的解析。

答案 1 :(得分:2)

简单地查看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

for lett in sent:
    my_dict.setdefault(lett, 0) += 1

但是请注意,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)

答案 2 :(得分:1)

使用字典理解:

plt.imshow(img2, cmap = 'gray')
plt.plot(aa = True)
plt.show()

但是使用mydict_countalpha = {c:sent.count(c) for c in alpha} 对象的效率更高,因为当前的解决方案是Counter,而创建O(n^2)对象的复杂度是Counter,然后我们可以进行过滤排除那些不在O(n)字符串中的字符。

alpha

答案 3 :(得分:1)

您可以使用字典理解

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

但是没有必要继续查找索引。直接循环alpha

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

但是,我通常这样做的方式是使用collections.Counter

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)

答案 4 :(得分:0)

在Edx论坛上,其他哈佛大学的学生发表了很多评论,他们尝试了不同的方法(包括for循环或理解)来编码正确的答案,但仍然无法理解要点。一样!

以下是初学者应根据此课程使用的方法。我在这里做了一些调整,以便所有浏览此书的学生仍然必须编写自己的代码才能通过...

sentenceA = 'I could not collect points on this homework and that is sad'
alphabet_string = string.ascii_letters
count_lett_dict = {}
for letters in sentenceA:
    if letters in alphabet_string:
        if letters in count_lett_dict:
            count_lett_dict[letters] += 1
        else:
            count_lett_dict[letters] = 1
count_lett_dict