在某种程度上,我正在使用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
答案 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.count
和list.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