利用Python实现外观数列求解

目录
  • 1. 引言
  • 2. 外观数列
  • 3. 代码思路
    • 3.1 提取输出的key
    • 3.2 提取每个key对应的value
    • 3.3 统计每个group对应的长度
    • 3.4 整合输出
    • 3.5 解决方案
  • 4. 总结

1. 引言

事情的由来是这样的,今天遇到一个非常有意思的题目,如下:

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实现该功能的快捷方式,最后给出了整个问题求解的样例代码。

到此这篇关于利用Python实现外观数列求解的文章就介绍到这了,更多相关Python外观数列求解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 翻转数列python实现,求前n项和,并能输出整个数列的案例

    这是刷题时遇到的一道题,题目描述:小Q定义了一种数列称为翻转数列: 给定整数n和m, 满足n能被2m整除.对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为'-';. 例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8. 而n = 4, m = 1, 数列就是: -1, +2, -3, + 4. 小Q现在希望你能帮他算算前n项和为多少. 如果只需求出N项和的话,这里可以有一个简便思路,观察规律哈,比如n

  • python斐波那契数列的计算方法

    题目: 计算斐波那契数列.具体什么是斐波那契数列,那就是0,1,1,2,3,5,8,13,21,34,55,89,144,233. 要求: 时间复杂度尽可能少 分析: 给出了三种方法: 方法1:递归的方法,在这里空间复杂度非常大.如果递归层数非常多的话,在python里需要调整解释器默认的递归深度.默认的递归深度是1000.我调整了半天代码也没有调整对,因为递归到1000已经让我的电脑的内存有些撑不住了. 方法2:将递归换成迭代,这样时间复杂度也在代码中标注出来了. 方法3:这种方法利用了求幂的

  • call在Python中改进数列的实例讲解

    我们都有过函数调用的经历,那么call调用类实例的过程就跟函数很相似.类的用法很多人都知道了,类实例又是什么呢?可以把类看成一个设计图,类实例就是设计出的成品.现在我们弄清楚了call调用对象的概念,就可以进一步用来在python中改进数组,想学的小伙伴一起往下看吧. __call__() Python里,函数式first-class对象,这表示,函数可以被传递给另外的函数或者方法,可以从子程序里返回,可以赋给变量. 类的实例也可以像函数一样被对待,比如将他们传递给其他的函数或者方法,并且被调用

  • python 获取url中的参数列表实例

    Python的urlparse有对url的解析,从而获得url中的参数列表 import urlparse urldata = "http://en.wikipedia.org/w/api.php?action=query&ctitle=FA" result = urlparse.urlparse(urldata) print result print urlparse.parse_qs(result.query) 输出: ParseResult(scheme='http',

  • 利用Python实现外观数列求解

    目录 1. 引言 2. 外观数列 3. 代码思路 3.1 提取输出的key 3.2 提取每个key对应的value 3.3 统计每个group对应的长度 3.4 整合输出 3.5 解决方案 4. 总结 1. 引言 事情的由来是这样的,今天遇到一个非常有意思的题目,如下: 1–11–21–1211–111221–312211 观察上述数字,找出其中的规律,并尝试思考给出下一个数字?哇偶,可以先仔细思考一下下... 2. 外观数列 外观数列是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项

  • 利用Python的sympy包求解一元三次方程示例

    环境说明:Python3.7.2+Jupyter Notebook 示例1(求解一元三次方程): import sympy as sp # 导入sympy包 x = sp.Symbol('x') # 定义符号变量 f = x**3 - 3*x**2 + 3*x - 9/16 # 定义要求解的一元三次方程 x = sp.solve(f) # 调用solve函数求解方程 x # solve函数的返回结果是一个列表 # x的值为[0.240852757031084,1.37957362148446-0

  • 利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定.假定没有外力时,两个弹簧的长度为L1和L2. 由于两物体有重力,那么在平面上形成摩擦力,那么摩擦系数分别为b1和b2.所以可以把微分方程写成这样: 这是一个二阶的微分方程,为了使用python来求解,需要把它转换为一阶微分方程

  • 利用Python实现斐波那契数列的方法实例

    今天我们来使用Python实现递归算法求指定位数的斐波那契数列 首先我们得知道斐波那契数列是什么? 斐波那契数列又叫兔子数列 斐波那契数列就是一个数列从第三项开始第三项的值是第一项和第二项的和依次类推 其次我们再来看递归算法是什么? 递归就是如果函数(子程序)包含了对其自身的调用,该函数就是递归的 话不多说上案例: 第一种方法:不使用递归算法 #首先定义一个新的列表来储存最后的结果 new_list = [] # 然后让用户输入指定位数 my_put = int(input("请输入使用递归算法

  • Python实现求数列和的方法示例

    本文实例讲述了Python实现求数列和的方法.分享给大家供大家参考,具体如下: 问题: 输入 输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述. 输出 对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数. 样例输入 81 4 2 2 样例输出 94.73 3.41 实现代码: import math while 1: x = raw_input() x = list(x.split(" "))

  • 梯度下降法介绍及利用Python实现的方法示例

    本文主要给大家介绍了梯度下降法及利用Python实现的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 梯度下降法介绍 梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向(因为在该方向上目标函数下降最快,这也是最速下降法名称的由来). 梯度下降法特点:越接近目标值,步长越小,下降速度越慢. 直观上

  • 利用python求积分的实例

    python的numpy库集成了很多的函数.利用其中的函数可以很方便的解决一些数学问题.本篇介绍如何使用python的numpy来求解积分. 代码如下: # -*- coding: utf-8 -*- import numpy as np from scipy.integrate import quad,dblquad,nquad def main(): print quad(lambda x:np.exp(-x),0,np.inf) '''求积分,np.inf代表正无穷. 结果第一个数值代表运

  • 利用Python将图片中扭曲矩形的复原

    前言 日常生活中,手残党们经常会把一些照片拍歪,比如拍个证件.试卷.PPT什么的, 比如下面这本书的封面原本是个矩形,随手一拍就成了不规则四边形 想要把它变成规则的矩形,有什么办法呢? 你一定想到了 PS,因为网上很多教程就是这么教的 打开PS ⟹\Longrightarrow⟹ 滤镜 ⟹\Longrightarrow⟹镜头校正 ⟹\Longrightarrow⟹自定 ⟹\Longrightarrow⟹变换 可是这样手工的调整数值实在是费劲哟!! 下面我们来写个程序,自动将图片恢复到任意矩形!

  • 利用Python实现最小二乘法与梯度下降算法

    导入所需库 %matplotlib inline import sympy import numpy as np import matplotlib.pyplot as plt from sympy.abc import x as a,y as b 生成模拟数据 # 模拟函数 y=3x-1 #自变量 x=np.linspace(-5,5,num=1000) #加入噪声 noise=np.random.rand(len(x))*2-1 #因变量 y=3*x-1+noise 查看所生成数据的图像 p

  • 如何利用Python批量处理行、列和单元格详解

    目录 精确调整工作表的行高和列宽 批量更改多个工作簿的数据格式 批量更改工作簿的外观格式 设置字体格式 修改字体为宋体 修改字号 字体加粗 字体颜色 单元格填充颜色 对齐方式 添加合适粗细的边框 替换工作簿的行数据 提取指定数据 提取列数据 追加行数据 提取所有工作表的唯一值 总结 精确调整工作表的行高和列宽 步骤 打开工作簿. 遍历所有工作表 核心代码 for i in workbook.sheets: value = i.range('A1').expand('table') value.c

随机推荐