运维开发网

用Python求解外观序列

运维开发网 https://www.qedev.com 2022-04-27 15:28 出处:网络
这篇文章主要介绍了利用Python实现外观数列求解,文章利用举例说明文章的主题内容,具有一定的参考价值,需要的小伙伴乐意参考一下

这篇文章主要介绍了利用Python实现外观数列求解,文章利用举例说明文章的主题内容,具有一定的参考价值,需要的小伙伴乐意参考一下


1. 引言

事情的起源是这样的。今天,我遇到了一个很有趣的话题,如下:

1ndash11ndash21ndash1211ndash111221ndash312211

观察上面的数字,找出规律,试着思考,给出下一个数字?
哇,你可以先仔细想想。。。


2. 外观数列

外观序列是一个整数序列,从数字1开始,序列中的每一项都是前一项的描述。

前五项如下:

1. ? ? 12. ? ? 113. ? ? 214. ? ? 12115. ? ? 1112211 被读作 ?"one 1" ?("一个一") , 即 11。11 被读作 "two 1s" ("两个一"), 即 21。21 被读作 "one 2", ?"one 1" ("一个二" , ?"一个一") , 即 1211。依次类推。。gt;gt;gt;[key for key, group in groupby('AAAABBBCCDAABBB')][A, B, C, D, A, B]

找出规律后,我们很容易知道第6项的编号是312211,第7项的编号是13112221。所以,我们可以写一个函数,自动帮助我们生成这个序列的一个项。


3. 代码思路

经过思考,我们可以得出结论,核心问题的解决方案是,我们需要统计一组数字在序列中出现的次数。


3.1 提取输出的key

因为出现序列中的每一个子项都是键出现的次数,所以我们可以使用groupby函数来获取子项中需要描述的键值,

例子如下:

gt;gt;gt;[key for key, group in groupby('AAAABBBCCDAABBB')][A, B, C, D, A, B]


3.2 提取每个key对应的value

如上面的输出所示,我们使用groupby函数对同一个键进行分组。因此,我们可以对每个键对应的值执行类型转换,

如下所示:

gt;gt;gt;[list(group) for key, group in groupby('AAAABBBCCDAABBB')][['A', 'A', 'A', 'A'], ['B', 'B', 'B'], ['C', 'C'], ['D'], ['A', 'A'], ['B', 'B', 'B']]


3.3 统计每个group对应的长度

经过上面的转换,我们将序列中的子项按照键值进行分组,然后就可以得到每组的长度。代码如下:

gt;gt;gt;[len(list(group)) for key, group in groupby('AAAABBBCCDAABBB')][4, 3, 2, 1, 2, 3]


3.4 整合输出

通过上面的逐步分析,我们已经方便地使用groupby实现了我们需要的输出。我们只需要整合分组后每组的长度和它的key。

代码如下:

gt;gt;gt;[(len(list(group)),key) for key, group in groupby('AAAABBBCCDAABBB')][(4, 'A'), (3, 'B'), (2, 'C'), (1, 'D'), (2, 'A'), (3, 'B')]


3.5 解决方案

正如上面的分析所示,我们知道元组包含每个值的计数和值本身。我们可以用上面的逻辑和Python来解决外观序列!

代码如下:


这里我们打印这个系列的前15项,也就是让参数迭代器= 15。此时,输出如下:



4. 总结

通过一个很有意思的题目介绍了出现序列的定义,然后通过实例分析找出了用Python实现这个功能的捷径。最后,给出了解决整个问题的示例代码。

关于用Python解决外观序列的这篇文章到此为止。关于Python出现序列的更多信息,请搜索源搜网之前的文章或者继续浏览下面的相关文章。希望大家以后能多支持源搜网!


0

精彩评论

暂无评论...
验证码 换一张
取 消