这篇文章主要介绍了利用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出现序列的更多信息,请搜索源搜网之前的文章或者继续浏览下面的相关文章。希望大家以后能多支持源搜网!