pyhon有4个内建的数据结构——List(列表)、Tuple(元组)、Dictionary(字典)以及Set(集合),他们可以统称为容器,因为它们实际上是一些元素组合而成的结构,而这些元素,可以是数字、字符甚至是列表,或者是它们之间几种的组合。通俗地讲,容器里是什么都行,而且容器里的元素类型不要求相同。
列表/元组
列表和元组都是序列机构,它们本身相似,但又有一点不同的地方。
从外形上看,列表与元组的区别是,列表是用方括号标记的,如a=[1,2,3],而元组是用圆括号标记的,如b=(4,5,6),访问列表和元组中的元素的方式都是一样的,如a[0]等于1,b[2]等于6等。上面已经谈及,容器里是什么都行,因此,下面的定义也是成立的。
c=[1,'abc',[1,2]]
'''
c是一个列表,列表的第一个元素是整型1,第二个是字符串'abc’,第三个是列表(1,2]
'''
从功能上看,列表与元组的区别是,列表可以被修改,而元组不可以。比如,对于a=[1,2,3],那么语句a[0]=0,就会将列表a修改为[0,2,3],而对于元组b=(4,5,6),语句b[0]=1就会报错。要注意的是,如果已经有了一个列表a,同时想复制a,命名为变量b,
那么b=a是无效的,这时候b仅仅是a的别名(或者说引用),修改b也会修改a的。正确的复制方法应该是b=a[:]。
与列表有关的函数是list,与元组有关的函数是 tuple,它们的用法和功能几乎一样,都是将某个对象转换为列表/元组,如 list(ab)的结果是[a,b], tuple([1,2])的结果是(1,2)。
下面是一些常见的与列表/元组相关的函数。
此外,作为对象,列表本身自带了很多实用的方法(元组不允许修改,因此方法很少)。
最后,不能不提的是“列表解析”这一功能,它能够简化我们对列表内元素逐一进行操作的代码,如下面的代码
a=[1,2,3]
b=[]
for i in a:
b append (1+ 2)
可以简化到
a =[1,2,3]
b=[i+2 for i in a]
这样的语法不仅方便,而且直观!充分体现了 Python语法的人性化。
字典
Python引入了“自编”这一方便的概念。从数学上来讲,它实际上是一个映射。通俗来讲,它也相当于一个列表,然而它的“下标”不再是以0开头的数字,而是让自己定义的“键”(Key)开始。
创建一个字典的基本方法为:
d={' today ': 20,'tomorrow: 301}
这里的 today、 tomorrow就是字典的键,它在整个字典中必须是唯一的,而20、30就是键对应的值,访问字典中元素的方法也很直观。
d['today'] #该值为20
d['tomorrow'] #该值为30
还有其他一些比较方便的方法来创建一个字典,如通过dict0函数转换,或者通过dict.fromkeys来创建,例如:
dict([[' today',20],[' tomorrow',30]]) #相当于{'today':20,' tomorrow':30}
dict. fromkeys(['today','tomorrow'], 20) #相当于{'today': 20,'tomorrow: 20}
很多字典的函数和方法与列表是一样的。
集合
Python内置了集合这一数据结构,同数学上的集合概念基本上是一致的,它与列表的区别在于:
1.它的元素是不重复的,而且是无序的;
2.它不支持索引。
一般我们通过花括号{}或者set0函数来创建一个集合。
s={1,2,2,3} #注意2会自动去重,得到{1,2,3}
s=set([1,2,2,3]) #同样,它将列表转换为集合,得到{1,2,3}
由于集合的特殊性(特别是无序性),因此集合有一些特别的运算。
a=t | s #t和s的并集
b=t & s #t和s的交集
c=t - s #求差集(项在t中,但不在s中)
d=t ^ s #对称差集(项在t或s中,但不会同时出现在二者中)
用python做数据分析的过程中,集合并不常用,所以这里仅仅简单地介绍它,。
函数式编程
函数式编程或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。简单来讲,函数式编程是一种“广播式”的编程,之前提到过的 lambda定义函数,用于
科学计算中,会显得特别简洁方便。在 Python中,函数式编程主要由几个函数的使用构成: lambda()、map()、 reduce()、filter(), lambda()前面已经介绍过,主要用来自定义“行内函数”,所以现在逐一介绍后三个。
首先介绍map()函数。假设有一个列表a=[1,2,3],要给列表中的每个元素都加2得到一个新列表,利用前面已经谈及过的“列表解析”,我们可以这样写:
b=[i+2 for i in a]
而利用map函数我们可以这样写:
b= map (lambda x: x+2, a)
b=1ist(b) #结果是[3,4,5]
也就是说,我们首先定义一个函数,然后再用map命令将函数逐一应用到(map)列表中的每个元素,最后返回一个数组。map()命令也接受多参数的函数,如map( lambda x,y:x*y,a,b)表示将a、b两个列表的元素对应相乘,把结果返回给新列表。
接着是 reduce()函数。它有点像map()函数,但map()函数用于逐一遍历,而是 reduce()函数用于递归计算。先给出一个例子,这个例子可以算出n的阶乘:
reduce (lambda x, y: x*y, range (1, n+1))
其中, range(1,n+1)相当于给出了一个列表,元素是1~n这n个整数。 lambda x,y:x*y构造了一个二元函数,返回两个参数的乘积。 reduce命令首先将列表的前两个元素作为函数的参数进行运算,然后将运算结果与第三个数字作为函数的参数,然后再将运算结果与第四个数字作为函数的参数……依此递推,直到列表结束,返回最终结果。如果用循环命令,那就要写成:
s=1
for i in range(1,n+1):
s=s*i
最后是 filter()函数。顾名思义,它是一个过滤器,用来筛选出列表中符合条件的元素,例如,
b= filter (lambda x: x>5 and x 8, range (10))
b=1ist(b) #结果是[6,7]
使用 filter()函数首先需要一个返回值为布尔值型的函数,如上述的 lambda x:x>5 and x<8定义了一个函数,判断x是否大于5且小于8,然后将这个函数作用到 range(10)的每个元素中,如果为True,则“挑出”那个元素,最后将满足条件的所有元素组成一个列表返回。
当然,上述 filter语句,可以用列表解析写为:
b= [i for i in range (10) if i > 5 and 1< 8]
它并不比 filter语句复杂。但是要注意,我们使用map()、 reduce()或 filter(),最终目的是兼顾简洁和效率,因为map()、 reduce()或 filter()的循环速度比 Python内置的for或 while循环要快得多。
閱讀更多 數據分析和挖掘 的文章