我的Python挑战解决方案-第2级:数据结构

我和我的丈夫正在参与一个名为Python挑战的编码难题。 我还没有走那么远,但是当我在2级上工作时,我发现自己对数据结构有所了解。

当您查看页面源代码时,这就是您所看到的。

所以这就是我解决这个问题的方法:

加载数据中

首先,我手动将文本复制并粘贴到.txt文件中。 然后,我使用Python的内置open函数返回文件对象,并使用read ()方法读取文件的内容。 我将内容保存到一个名为text的变量中。

text = open('resources/level2.txt').read()

解决问题

现在我们有了一些文本,挑战是要我们编写一个程序来查找稀有字符,换句话说,找到该文本中最少重复的字符。

首先,我们需要知道每个字符重复多少次。 一旦有了这些信息,我们就可以找到重复最少的字符。

哪种数据结构对于存储此信息有用? 一本字典! 因为字典是键-值对的集合,所以在这里我们可以将字符用作键,将重复作为值。

因此,我将从定义字典开始。 我们称它为字符或字符频率。 我们将其设置为空字典。

char_frequency = {}

现在我们需要遍历字符串,获取每个字符,并在此字典中更新其频率。 因此,我们需要一个for循环。

for char in text:

现在首先我们需要查看字典中是否有此字符。 如果我们确实具有此字符,则只需获得其频率值并将其增加1 。 否则,我们需要将其添加到字典中。 因此,我们将char的char_frequency设置为1

 如果char在char_frequency中: 
  char_frequency [char] + = 1 
 其他: 
  char_frequency [char] = 1 

让我们打印该词典,看看会得到什么。

print(char_frequency)

通过保存更改并按Ctrl + alt + n在VScode中使用代码运行程序扩展名运行程序。

因此, '%'被重复6104, '$'被重复6046, '@'被重复6157次,依此类推。

现在,此输出有点不可读。 因此,我将向您展示提高其可读性的技巧。 我们有一个称为漂亮打印的模块。 在代码的顶部,我们从pprint模块导入pprint函数

from pprint import pprint

使用此功能,我们可以更好地控制终端上的打印内容。

因此,现在,我们使用pprint作为第二个参数,而不是常规的print函数,传递一个名为width的关键字参数,该参数确定每行上的字符数。 如果此输出不适合,则此函数将添加换行符。 让我们将其设置为1,看看运行程序时会发生什么。

pprint(char_frequency, width =1)

寻找答案

因此,现在我们拥有解决此问题的所有信息。 下一步是按字符频率对字典进行排序。 但是,字典(如集合)是无序集合,我们无法对它们进行排序。 我们只能对列表进行排序。 因此,我们需要提取字典中的项目并将其放在列表中以进行排序。

基本上,我们需要取出每个键值对,将其转换为元组,然后将其放入列表中。 我们将得到一个易于排序的元组列表。 我们应该怎么做?

我将调用一个已sorted内置函数,该函数从一个可迭代对象构建一个新的已排序列表。 此函数需要迭代并对其进行排序。 作为迭代,我将传递char_frequency.items() 。 此.items()方法返回一个视图对象,该对象显示字典(键,值)元组对的列表。 因此,在这一点上,让我们看看如果打印此结果会得到什么。

print(sorted(char_frequency.items()))

我们得到一个元组列表! 在每个元组中,我们有两个项目:第一个是字符,第二个是重复或频率。

但是,如您所见,该列表未排序,因为默认情况下,此sorted函数不知道如何对这些元组进行排序。

我们可以将第二个参数传递给已sorted函数,以自定义排序顺序key 。 我们将其设置为lambda ,这是一个匿名函数。 此lambda函数采用键值对kv并返回该值。 在这种情况下,我们通过使用方括号[]与一个或多个索引进行切片来访问元组中的值,以获取该索引处可用的值。 因此,此lambda函数将返回的值为kv[1] 。 这是每个字符的频率,我们将使用它进行排序。

因此,让我们再运行一​​次该程序。

得到答案

最后,此列表中频率等于1的字符是我们问题的解决方案。 仅出现一次的稀有字符是e,q,u,a,l,i,t,y。 答案是“平等”。 我在URL中替换了equality ,这使我面临下一个挑战!

这将我们带到#pythonchallenge 2级解决方案的结尾。 感谢您的阅读和快乐编码!