python基础数据结构
Ⅰ python基础数据结构:序列、映射、集合
参考资料:http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html
Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。
一、序列(列表、元组和字符串)
序列中的每个元素都有自己的编号。Python中有6种内建的序列。其中列表和元组是最常见的类型。其他包括字符串、Unicode字符串、buffer对象和xrange对象。下面重点介绍下列表、元组和字符串。
1、列表
列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。
(1)、创建
通过下面的方式即可创建一个列表:
输出:
['hello', 'world']
[1, 2, 3]
可以看到,这中创建方式非常类似于javascript中的数组。
(2)、list函数
通过list函数(其实list是一种类型而不是函数)对字符串创建列表非常有效:
输出:
['h', 'e', 'l', 'l', 'o']
2、元组
元组与列表一样,也是一种序列,唯一不同的是元组不能被修改(字符串其实也有这种特点)。
(1) 、创建
输出:
(1, 2, 3) ('jeffreyzhao', 'cnblogs') (1, 2, 3, 4) () (1,)
从上面我们可以分析得出:
a、逗号分隔一些值,元组自动创建完成;
b、元组大部分时候是通过圆括号括起来的;
c、空元组可以用没有包含内容的圆括号来表示;
d、只含一个值的元组,必须加个逗号(,);
(2)、tuple函数
tuple函数和序列的list函数几乎一样:以一个序列(注意是序列)作为参数并把它转换为元组。如果参数就算元组,那么该参数就会原样返回:
输出:
(1, 2, 3)
('j', 'e', 'f', 'f')
(1, 2, 3)
Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
t4=tuple(123)
TypeError: 'int' object is not iterable
3、字符串
(1)创建
输出:
Hello world
H
H
e
l
l
o
w
o
r
l
d
(2)、格式化
format():
print(‘{0} was {1} years old when he wrote this book’. format(name,age) )
print(‘{} was {} years old when he wrote this book’. format(name,age) )
print(‘{name} was {age} years old when he wrote this book’. format(name=’Lily’,age=’22’) )
#对于浮点数“0.333”保留小数点后三位
print(‘{0 : .3f}’.format(1.0/3) )
结果:0.333
#使用下划线填充文本,并保持文字处于中间位置
#使用^定义‘_____hello_____’字符串长度为11
print(‘{0 : ^_11}’.format(‘hello’) )
结果:_____hello_____
% :
格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(如字典),那么字符串格式化将会有所不同。
输出:
Hello,world
Hello,World
注意:如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来:
输出:
Traceback (most recent call last):
File "F:\Python\test.py", line 2, in
str1='%s,%s' % 'Hello','world'
TypeError: not enough arguments for format string
如果需要输出%这个特殊字符,毫无疑问,我们会想到转义,但是Python中正确的处理方式如下:
输出:100%
对数字进行格式化处理,通常需要控制输出的宽度和精度:
输出:
3.14
3.141593
3.14
字符串格式化还包含很多其他丰富的转换类型,可参考官方文档。
4、通用序列操作(方法)
从列表、元组以及字符串可以“抽象”出序列的一些公共通用方法(不是你想象中的CRUD),这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,还有计算序列长度、最大最小元素等内置函数。
(1)索引
输出
H
2
345
索引从0(从左向右)开始,所有序列可通过这种方式进行索引。神奇的是,索引可以从最后一个位置(从右向左)开始,编号是-1:
输出:
o
3
123
(2)分片
分片操作用来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现:
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4]
[6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[7, 8]
[7, 8, 9]
不同的步长,有不同的输出:
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[0, 3, 6, 9]
[]
(3)序列相加
输出:
Hello world
[1, 2, 3, 2, 3, 4]
Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
print str1+num1
TypeError: cannot concatenate 'str' and 'list' objects
(4)乘法
输出:
[None, None, None, None, None, None, None, None, None, None]
HelloHello
[1, 2, 1, 2]
Traceback (most recent call last):
File "F:\Python\test.py", line 5, in
print str1*num1
TypeError: can't multiply sequence by non-int of type 'list'
(5)成员资格
in运算符会用来检查一个对象是否为某个序列(或者其他类型)的成员(即元素):
输出:
False
True
True
(6)长度、最大最小值
通过内建函数len、max和min可以返回序列中所包含元素的数量、最大和最小元素。
输出:
5
o
H
5
123
1
二、映射(字典)
映射中的每个元素都有一个名字,如你所知,这个名字专业的名称叫键。字典(也叫散列表)是Python中唯一内建的映射类型。
1、键类型
字典的键可以是数字、字符串或者是元组,键必须唯一。在Python中,数字、字符串和元组都被设计成不可变类型,而常见的列表以及集合(set)都是可变的,所以列表和集合不能作为字典的键。键可以为任何不可变类型,这正是Python中的字典最强大的地方。
输出:
{1: 1}
Traceback (most recent call last):
File "F:\Python\test.py", line 6, in
d[list1]="Hello world."
TypeError: unhashable type: 'list'
2、自动添加
即使键在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。
3、成员资格
表达式item in d(d为字典)查找的是键(containskey),而不是值(containsvalue)。
三、集合
集合(Set)在Python 2.3引入,通常使用较新版Python可直接创建,如下所示:
strs=set(['jeff','wong','cnblogs'])
nums=set(range(10))
看上去,集合就是由序列(或者其他可迭代的对象)构建的。集合的几个重要特点和方法如下:
1、副本是被忽略的
集合主要用于检查成员资格,因此副本是被忽略的,如下示例所示,输出的集合内容是一样的。
输出如下:
set([0, 1, 2, 3, 4, 5])
set([0, 1, 2, 3, 4, 5])
2、集合元素的顺序是随意的
这一点和字典非常像,可以简单理解集合为没有value的字典。
输出如下:
set(['wong', 'cnblogs', 'jeff'])
3、集合常用方法
a、并集union
输出:
set([1, 2, 3])
set([2, 3, 4])
set([1, 2, 3, 4])
union操作返回两个集合的并集,不改变原有集合。使用按位与(OR)运算符“|”可以得到一样的结果:
输出和上面union操作一模一样的结果。
其他常见操作包括&(交集),<=,>=,-,()等等,这里不再列举。
输出如下:
set([1, 2, 3])
set([2, 3, 4])
set([2, 3])
True
set([1, 2, 3])
False
b、add和remove
和序列添加和移除的方法非常类似,可参考官方文档:
输出:
set([1])
set([1, 2])
set([1])
set([1])
False
Traceback (most recent call last):
File "F:\Python\test.py", line 9, in
set1.remove(29) #移除不存在的项
KeyError: 29
4、frozenset
集合是可变的,所以不能用做字典的键。集合本身只能包含不可变值,所以也就不能包含其他集合:
输出如下:
Traceback (most recent call last):
File "F:\Python\test.py", line 3, in
set1.add(set2)
TypeError: unhashable type: 'set'
可以使用frozenset类型用于代表不可变(可散列)的集合:
输出:
set([1, frozenset([2])])
Ⅱ 零基础学Python需要多久
Python学习路线。
第一阶段Python基础与linux数据库。这是Python的入门阶段,也是帮助零基础学员打好基础的重要阶段。你需要掌握Python基本语法规则及变量、逻辑控制、内置数据结构、文件操作、高级函数、模块、常用标准库模块、函数、异常处理、MySQL使用、协程等知识点。
学习目标:掌握Python基础语法,具备基础的编程能力;掌握Linux基本操作命令,掌握MySQL进阶内容,完成银行自动提款机系统实战、英汉词典、歌词解析器等项目。
第二阶段WEB全栈。这一部分主要学习Web前端相关技术,你需要掌握HTML、CSS、JavaScript、jQuery、BootStrap、Web开发基础、VUE、Flask Views、Flask模板、 数据库操作、Flask配置等知识。
学习目标:掌握WEB前端技术内容,掌握WEB后端框架,熟练使用Flask、Tornado、Django,可以完成数据监控后台的项目。
第三阶段数据分析+人工智能。这部分主要是学习爬虫相关的知识点,你需要掌握数据抓取、数据提取、数据存储、爬虫并发、动态网页抓取、scrapy框架、分布式爬虫、爬虫攻防、数据结构、算法等知识。
学习目标:可以掌握爬虫、数据采集,数据机构与算法进阶和人工智能技术。可以完成爬虫攻防、图片马赛克、电影推荐系统、地震预测、人工智能项目等阶段项目。
第四阶段高级进阶。这是Python高级知识点,你需要学习项目开发流程、部署、高并发、性能调优、Go语言基础、区块链入门等内容。
学习目标:可以掌握自动化运维与区块链开发技术,可以完成自动化运维项目、区块链等项目。
按照上面的Python学习路线图学习完后,你基本上就可以成为一名合格的Python开发工程师。当然,想要快速成为企业竞聘的精英人才,你需要有好的老师指导,还要有较多的项目积累实战经验。
自学本身难度较高,一步一步学下来肯定全面且扎实,如果自己有针对性的想学哪一部分,可以直接跳过暂时不需要的针对性的学习自己需要的模块,可以多看一些不同的视频学习。系统学习一般在5-6个月。
Ⅲ python3种数据类型
Python3 中有六个标准的数据类型:Number(数字) + String(字符串) + List(列表) + Tuple(元组) + Sets(集合) + Dictionary(字典)。
Number(数字)
数字类型是顾名思义是用来存储数值的,需要记住的是,有点和Java的字符串味道差不多,如果改变了数字数据类型的值,将重新分配内存空间。
可以使用del语句删除一些数字对象的引用:del var1[,var2[,var3[....,varN]]]]。
Python 支持三种不同的数值类型:
1.整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。
2.浮点型(float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
3.复数( (complex)) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
数字类型转换
1.int(x) 将x转换为一个整数。
2.float(x) 将x转换到一个浮点数。
3.complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
4.complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。
额外说明
和别的语言一样,数字类型支持各种常见的运算,不过python的运算比别的大多数常见语言都更加丰富,此外,还有大量丰富的方法,提供更高效的开发。
String(字符串)
创建字符串
创建字符串可以使用单引号、双引号、三单引号和三双引号,其中三引号可以多行定义字符串,有点类似ES6中的反引号。
Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用。
访问字符串中的值
和ES一样,可以使用方括号来截图字符串,例子如下:
val_str='yelloxing'
print(val_str[0]) #y
print(val_str[1:3]) #el
print(val_str[:3]) #yel
print(val_str[:5]) #yello
字符串运算符
除了上面已经说明的方括号,还有一些别的字符串运算,具体查看文档。
字符串格式化
temp="我叫 %s 今年 %d 岁!" % ('心叶', 7)
print('['+temp+']') #[我叫 心叶 今年 7 岁!]
如上所示,字符串支持格式化,当然,出来上面用到的%s和%d以外,还有一些别的,具体看文档;是不是感觉有点C语言的味道。
额外说明
所有的字符串都是Unicode字符串(针对python3),有很多有用的方法,真的很有ES和C结合体的味道。
List(列表)
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
Python有6个序列的内置类型(列表、元组、字符串、Unicode字符串、buffer对象和xrange对象)。
列表其实类似数组,具体的一些操作就很像字符串(类似ES中数组和字符串的关系)。
常见运算
下面用一个例子来展示一些常见的运算:
val_arr=['Made','in','China']
del val_arr[1]
print(val_arr) #['Made', 'China']
print(len(val_arr)) #2
val_newarr=val_arr+[':information']
print(val_newarr) #['Made', 'China', ':information']
val_arr=val_arr*2
print(val_arr) #['Made', 'China', 'Made', 'China']
print('in' in val_arr) #False
print('Made' in val_arr) #True
for row in val_newarr:
print(row, end=" - ") #Made - China - :information -
print(val_newarr[-1]) #:information
print(val_newarr[1:]) #['China', ':information']
再来看一个有用的例子:
cols=3
rows=2
list_2d = [[0 for col in range(cols)] for row in range(rows)]
print(list_2d) #[[0, 0, 0], [0, 0, 0]]
嵌套列表
使用嵌套列表即在列表里创建其它列表,例如:
loop_arr=['yelloxing','心叶']
result_arr=[loop_arr,'同级别']
print(result_arr) #[['yelloxing', '心叶'], '同级别']
列表的嵌套就很灵活,此外随便提一下:和前面说的一样,也有很多方法提供高效的开发。
Tuple(元组)
元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号。
创建
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用
tup1 = ('Google', 'Runoob', 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = "a", "b", "c", "d";
print(tup1) #('Google', 'Runoob', 1997, 2000)
print(tup2) #(1, 2, 3, 4, 5)
print(tup3) #('a', 'b', 'c', 'd')
基本操作
和列表的操作很相似,下面说一个几天特殊的地方:
1.del可以删除某个元组,不过不可以删除元组的某个条目。
2.不可以修改,或许元组会更快,感觉的,没有实际测试。
3.由于元组不可以修改,虽然同样有一些方法,不过和修改相关的方法就没有了。
Sets(集合)
回想一下数学里面的集合,合、交、差、补等运算是不是一下子回想起来了,这里的集合也有这些方法。
和Java的集合类似,一个无序不重复元素集(与列表和元组不同,集合是无序的,也无法通过数字进行索引)。
更具体的说明,如果必要会在单独说明。
Dictionary(字典)
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,键必须是唯一的,但值则不必。
和ES中的JSON的差不多,操作也很像,不过区别也很大,内置方法很多,具体还是一样,看文档去。
删除字典元素
可以用del删除一个条目或字典,也可以用clear()方法清空字典(比如现在有字段dict,就是:dict.clear())。
Ⅳ Python该怎么入门
对于python的入门
首先会学习python基础语法,面向对象编程与程序设计模式的理解、python数据分析基础、python网络编程、python并发与高效编程等等。
通过前期python学习来了解和掌握常量变量的使用,运算符的使用、流程控制的使用等,最后掌握python编程语言的基础内容。
并会对常见数据结构和相应算法进行学习,注重表格的处理,树结构的处理知识。
第二阶段主要学习内容是web页面开发、web页面特效开发、数据持久化开发、linux运维开发、linux测试开发、服务器集群架构等等。
对js的掌握并在网络前端中使用,而且需要详细将js学习并掌握,为将来从事全栈工作打下基础,也会学习linux操作系统的基础知识和掌握linux操作系统常用命令,并会学习linux自动化运维技巧等。
第三阶段主要学习网络爬虫,数据分析加人工智能:
这一个阶段需要学习的内容也是比较多的,例如:爬虫与数据、多线程爬虫、go语言、NoSQL数据库、Scrapy-Redis框架。
需要掌握爬虫的工作原理和设计思想,掌握反爬虫机制,并且通过学习NoSQL数据库和Scrapy-Redis框架,并且可以使用分布式爬虫框架实现大量数据的获取。
数据分析和人工智能阶段需要学习的数据分析、人工智能深度学习、量化交易模型、数据分析-特征工程和结果可视化和人工智能机器学习等等。
需要理解随机变量的数字特征的概念和性质,并会利用性质计算随机变量的数字特征,了解可视化过程,图形绘制。并且需要掌握Matplotlib模块、常用的机器学习算法等等。
最后就是对于python的入门学习,我们在学习理论、学习python语法基础的同时我们应该多动手、多联系。但是呢,对于我们零基础的小伙伴呢,一般不建议自学。
你肯定要问为什么?我就知道!原因大概有三点:
首先我们自学虽然成本低、学习时间灵活等,但是你想过没,你要自学到就业的程度大概需要多长时间,辞职在家学习,或者买个网课,每天听课、练,你可能需要1年左右,就这你还不一定能够学会、换不一定能够全面掌握企业需要的技术;然后报班学习的学员都已经学完工作半年了。
其次就是学习知识的系统性、前沿性。IT行业的学习一定要系统,不能说我们这里一点那里学一点,完了全是一片一片的知识点,听起来你都有涉及但是真正做项目反而使用不起来,很耽误时间。其次就是前沿性,学习时一定要选择最新的课程大纲、最新的课程。IT行业的技术更新很快。
最后就是就业服务和保障,我们选择报班学习一般都有就业服务,当然我们在学习完也会进行模拟面试和简历指导的等工作。其次就是服务,一般培训机构都有合作企业来招聘,大大增加了我们的就业机会。
总而言之你是零基础选择培训绝对是最快速的转行入门途径!
Ⅳ python基本结构有哪三种
程序的基本结构
程序由三种基本结构组成:顺序结构、分支结构和循环结构。任何程序都由这三种基本结构组合而成。
这些基本结构都有一个入口和一个出口。任何程序都由这三种基本结构组合而成。
顺序结构
顺序结构是程序按照线性顺序依次执行的一种运行方式,其中语句块1S1和语句块S2表示一个或一组顺序执行的语句。
分支结构
分支结构是程序根据条件判断结果而选择不同向前执行路径的一种运行方式,基础的分支结构是二分支结构。由二分支结构会组合形成多分支结构。
循环结构
循环结构是程序根据条件判断结果向后反复执行的一种运行方式,根据循环体触发条件不同,包括条件循环和遍历循环结构。
Ⅵ python自带及pandas、numpy数据结构(一)
1.python自带数据结构:序列(如list)、映射(如字典)、集合(set)。
以下只介绍序列中的list:
创建list:
list1 = []
list1 = [1,2,3,4,5,6,7,8,9] #逗号隔开
list2 = [[1,2],[3,4],[5,6],[7,8]] #list2长度(len(list2))为2,list2[0] = [1,2]
liststring = list(“thisisalist”) #只用于创建字符串行表
索引list:
e = list1[0] #下标从零开始,用中括号
分片list:
es = list1[0:3]
es = list1[0:9:2] #步长在第二个冒号后
list拼接(list1.append(obj)、加运算及乘运算):
list长度:
list每个元素乘一个数值:
list2 = numpy.dot(list2,2)
list类似矩阵相乘(每个元素对应相乘取和):
list3 = numpy.dot(list1,list1)
#要求相乘的两个list长度相同
list3 = numpy.dot(list2,list22)
#要求numpy.shape(list2)和numpy.shape(list22)满足“左行等于右列”的矩阵相乘条件,相乘结果numpy.shape(list3)满足“左列右行”
2.numpy数据结构:
Array:
产生array:
data=np.array([[1, 9, 6], [2, 8, 5], [3, 7, 4]])
data=np.array(list1)
data1 = np.zeros(5) #data1.shape = (5,),5列
data1 = np.eye(5)
索引array:
datacut = data[0,2] #取第零行第二列,此处是6
切片array:
datacut = data[0:2,2] # array([6, 5])
array长度:
data.shape
data.size
np.shape(data)
np.size(data)
len(data)
array拼接:
#括号内也有一个括号(中括号或者小括号)!
d = np.concatenate((data,data))
d = np.concatenate((data,data),axis = 1) #对应行拼接
array加法:逐个相加
array乘法:
d = data data #逐个相乘
d = np.dot(data,data) #矩阵相乘
d = data 3 #每个元素乘3
d = np.dot(data,3) #每个元素乘3
array矩阵运算:
取逆 : np.linalg.inv(data)
转置:data.T
所有元素求和 : np.sum(data)
生成随机数:np.random.normal(loc=0, scale=10, size=None)
生成标准正态分布随机数组:np.random.normal(size=(4,4))
生成二维随机数组:
np.random.multivariate_normal([0,0],np.eye(2))
生成范围在0到1之间的随机矩阵(M,N):
np.random.randint(0,2,(M,N))
Matrix:
创建matrix:
mat1 = np.mat([[1, 2, 3], [4, 5, 6]])
mat1 = np.mat(list)
mat1 = np.mat(data)
matrix是二维的,所有+,-,*都是矩阵操作。
matrix索引和分列:
mat1[0:2,1]
matrix转置:
np.transpose(mat1)
mat1.transpose()
matrix拼接:
np.concatenate([mat1,mat1])
np.concatenate([mat1,mat1],axis = 1)
numpy数据结构总结:对于numpy中的数据结构的操作方法基本相同:
创建:np.mat(list),np.array(list)
矩阵乘:np.dot(x,y)
转置:x.T or np.transpose(x)
拼接:np.concatenate([x,y],axis = 1)
索引:mat[0:1,4],ary[0:1,4]
3.pandas数据结构:
Series:
创建series:
s = pd.Series([[1,2,3],[4,5,6]],index = [‘a’,‘b’])
索引series:
s1 = s[‘b’]
拼接series:
pd.concat([s1,s1],axis = 1) #也可使用s.append(s)
DataFrame:
创建DaraFrame:
df = pd.DataFrame([[1,2,3],[1,2,3]],index = ['a','b'],columns = ['x','y','z'])
df取某一列:
dfc1 =df.x
dfc1 = df[‘x’]
dfc2 = df.iloc[:,0] #用.iloc方括号里是数字而不是column名!
dfc2 = df.iloc[:,0:3]
df取某一行:
dfr1 = df.iloc[0]
df1 = df.iloc[0:2]
df1 = df[0:2] #这种方法只能用于取一个区间
df取某个值:
dfc2 = df.iloc[0,0]
dfc2 = df.iloc[0:2,0:3]
Ⅶ python中的数据结构分析
1.Python数据结构篇
数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and Data Structures) [该网址链接可能会比较慢]时写下的阅读记录,当然,也结合了部分[算法导论](Introction to Algorithms)
中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱。这部分主要是介绍了如何使用Python实现常用的一些数据结构,例
如堆栈、队列、二叉树等等,也有Python内置的数据结构性能的分析,同时还包括了搜索和排序(在算法设计篇中会有更加详细的介绍)的简单总结。每篇文
章都有实现代码,内容比较多,简单算法一般是大致介绍下思想及算法流程,复杂的算法会给出各种图示和代码实现详细介绍。
**这一部分是下
面算法设计篇的前篇,如果数据结构还不错的可以直接看算法设计篇,遇到问题可以回来看数据结构篇中的某个具体内容充电一下,我个人认为直接读算法设计篇比
较好,因为大家时间也都比较宝贵,如果你会来读这些文章说明你肯定有一定基础了,后面的算法设计篇中更多的是思想,这里更多的是代码而已,嘿嘿。**
(1)[搜索](Python Data Structures)
简述顺序查找和二分查找,详述Hash查找(hash函数的设计以及如何避免冲突)
(2)[排序](Python Data Structures)
简述各种排序算法的思想以及它的图示和实现
(3)[数据结构](Python Data Structures)
简述Python内置数据结构的性能分析和实现常用的数据结构:栈、队列和二叉堆
(4)[树总结](Python Data Structures)
简述二叉树,详述二叉搜索树和AVL树的思想和实现
2.Python算法设计篇
算法设计篇主要是阅读[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)[**点击链接可进入Springer免费下载原书电子版**]之后写下的读书总结,原书大部分内容结合了经典书籍[算法导论](Introction to Algorithms),
内容更加细致深入,主要是介绍了各种常用的算法设计思想,以及如何使用Python高效巧妙地实现这些算法,这里有别于前面的数据结构篇,部分算法例如排
序就不会详细介绍它的实现细节,而是侧重于它内在的算法思想。这部分使用了一些与数据结构有关的第三方模块,因为这篇的重点是算法的思想以及实现,所以并
没有去重新实现每个数据结构,但是在介绍算法的同时会分析Python内置数据结构以及第三方数据结构模块的优缺点,也就意味着该篇比前面都要难不少,但
是我想我的介绍应该还算简单明了,因为我用的都是比较朴实的语言,并没有像算法导论一样列出一堆性质和定理,主要是对着某个问题一步步思考然后算法就出来
了,嘿嘿,除此之外,里面还有很多关于python开发的内容,精彩真的不容错过!
这里每篇文章都有实现代码,但是代码我一般都不会分
析,更多地是分析算法思想,所以内容都比较多,即便如此也没有包括原书对应章节的所有内容,因为内容实在太丰富了,所以我只是选择经典的算法实例来介绍算
法核心思想,除此之外,还有不少内容是原书没有的,部分是来自算法导论,部分是来自我自己的感悟,嘻嘻。该篇对于大神们来说是小菜,请一笑而过,对于菜鸟
们来说可能有点难啃,所以最适合的是和我水平差不多的,对各个算法都有所了解但是理解还不算深刻的半桶水的程序猿,嘿嘿。
本篇的顺序按照原书[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)的章节来安排的(章节标题部分相同部分不同哟),为了节省时间以及保持原着的原滋原味,部分内容(一般是比较难以翻译和理解的内容)直接摘自原着英文内容。
**1.
你也许觉得很多内容你都知道嘛,没有看的必要,其实如果是我的话我也会这么想,但是如果只是归纳一个算法有哪些步骤,那这个总结也就没有意义了,我觉得这
个总结的亮点在于想办法说清楚一个算法是怎么想出来的,有哪些需要注意的,如何进行优化的等等,采用问答式的方式让读者和我一起来想出某个问题的解,每篇
文章之后都还有一两道小题练手哟**
**2.你也许还会说算法导论不是既权威又全面么,基本上每个算法都还有详细的证明呢,读算法导论岂
不更好些,当然,你如果想读算法导论的话我不拦着你,读完了感觉自己整个人都不好了别怪小弟没有提醒你哟,嘻嘻嘻,左一个性质右一个定理实在不适合算法科
普的啦,没有多少人能够坚持读完的。但是码农与蛇的故事内容不多哟,呵呵呵**
**3.如果你细读本系列的话我保证你会有不少收获的,需要看算法导论哪个部分的地方我会给出提示的,嘿嘿。温馨提示,前面三节内容都是介绍基础知识,所以精彩内容从第4节开始哟,么么哒 O(∩_∩)O~**
(1)[Python Algorithms - C1 Introction](Python Algorithms)
本节主要是对原书中的内容做些简单介绍,说明算法的重要性以及各章节的内容概要。
(2)[Python Algorithms - C2 The basics](Python Algorithms)
**本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。**
(3)[Python Algorithms - C3 Counting 101](Python Algorithms)
原书主要介绍了一些基础数学,例如排列组合以及递归循环等,但是本节只重点介绍计算算法的运行时间的三种方法
(4)[Python Algorithms - C4 Inction and Recursion and Rection](Python Algorithms)
**本节主要介绍算法设计的三个核心知识:Inction(推导)、Recursion(递归)和Rection(规约),这是原书的重点和难点部分**
(5)[Python Algorithms - C5 Traversal](Python Algorithms)
**本节主要介绍图的遍历算法BFS和DFS,以及对拓扑排序的另一种解法和寻找图的(强)连通分量的算法**
(6)[Python Algorithms - C6 Divide and Combine and Conquer](Python Algorithms)
**本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法**
(7)[Python Algorithms - C7 Greedy](Python Algorithms)
**本节主要通过几个例子来介绍贪心策略,主要包括背包问题、哈夫曼编码和最小生成树等等**
(8)[Python Algorithms - C8 Dynamic Programming](Python Algorithms)
**本节主要结合一些经典的动规问题介绍动态规划的备忘录法和迭代法这两种实现方式,并对这两种方式进行对比**
(9)[Python Algorithms - C9 Graphs](Python Algorithms)
**本节主要介绍图算法中的各种最短路径算法,从不同的角度揭示它们的内核以及它们的异同**