Python外观数列求解
赵卓不凡 人气:01. 引言
事情的由来是这样的,今天遇到一个非常有意思的题目,如下:
1–11–21–1211–111221–312211
观察上述数字,找出其中的规律,并尝试思考给出下一个数字?
哇偶,可以先仔细思考一下下。。。
2. 外观数列
外观数列是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
前五项如下:
1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 "one 1" ("一个一") , 即 11。 11 被读作 "two 1s" ("两个一"), 即 21。 21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。 依次类推。。>>>[key for key, group in groupby('AAAABBBCCDAABBB')] [A, B, C, D, A, B]
找出规律后,我们可以很方便的知道第6项的数字为 312211, 第7项为 13112221。所以,我们可以编写一个函数,来自动帮我们生成这个数列的某一项。
3. 代码思路
经过思考,我们你可以总结出核心问题的求解在于我们需要统计出一组数字在序列中出现的次数。
3.1 提取输出的key
因为外观数列中每个子项都是统计数字key
出现的次数,所以我们可以利用groupby
函数来获取子项中需要描述的key值,
样例如下:
>>>[key for key, group in groupby('AAAABBBCCDAABBB')] [A, B, C, D, A, B]
3.2 提取每个key对应的value
正如上述输出所展示的,我们使用groupby
函数将同一key进行分组。因此,我们可以对每个key
对应的value
进行类型转换,
如下:
>>>[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对应的长度
经过上述转换,我们按照key值对数列中的子项进行了分组,进而我们可以获取每个group的长度,代码如下:
>>>[len(list(group)) for key, group in groupby('AAAABBBCCDAABBB')] [4, 3, 2, 1, 2, 3]
3.4 整合输出
通过上述一步步的分析,我们已经很方便地使用groupby来实现我们需要的输出了,我们只需要整合每个group分组后的长度以及其key即可,
代码如下:
>>>[(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项,即让参数iterator = 15
,此时的输出如下:
4. 总结
本文通过一道非常有趣的题目引入了外观数列的定义,然后通过举例分析找出用Python实现该功能的快捷方式,最后给出了整个问题求解的样例代码。
加载全部内容