1.3Python中的复合数据类型

(1)list列表的使用

#list列表

a = ["张三","男",23,"江苏","硕士","已婚",["身高175","体重51"]]
print(a[0])
print(a[-1])
print(a[-1][1])
print(a[-3:])
print(a[:3])
print(a[::2])
print(a[0:-1])
print(a[6])

输出结果:

张三
['身高175', '体重51']
体重51
['硕士', '已婚', ['身高175', '体重51']]
['张三', '男', 23]
['张三', 23, '硕士', ['身高175', '体重51']]
['张三', '男', 23, '江苏', '硕士', '已婚']
['身高175', '体重51']

list列表
(1)列表的构造通过英文状态下的方括号来达成,可以存放多种数据类型
(2)列表是一种序列,每一个元素都有自己确定的位置
(3)列表是一种可变类型的数据结构
索引的方式有很多,例如正向索引,负向索引,切片索引,指定开头,结尾(包含最后一个元素)和步长,序列的位置信息跟数组十分相似

列表元素的增加

a = [1,2,3];
print(a)
a.append(4)
print(a)
a.extend([3,2,1])
print(a)
#insert有两个参数,第一个是位置的索引,第二个是要加入的值
a.insert(0,-1)
print(a)

输出结果:

[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 3, 2, 1]
[-1, 1, 2, 3, 4, 3, 2, 1]

列表元素的删除

a = [10,20,30,5,8,8,6,6]
a.pop()
print(a)
a.pop(2)
print(a)
#remove的删除是从左往右的删除
a.remove(8)
print(a)
#清空整个列表
a.clear()
print(a)
a = [20,39,45,63,13,24,66]
b = sorted(a,reverse=True)
print(b)
b.reverse()
print(b)

输出结果:

[10, 20, 30, 5, 8, 8, 6]
[10, 20, 5, 8, 8, 6]
[10, 20, 5, 8, 6]
[]
[66, 63, 45, 39, 24, 20, 13]
[13, 20, 24, 39, 45, 63, 66]


(2) tuple元组

my_tuple = 1,2,3
my_tuple = (1,2,3)
singleton = 1;
#元组与列表十分类似,元组通过英文状态下的圆括号构成
b1 = (9,)
print(b1)
#由于元组是不可变类型,所以只用两种方法,count 和index
#统计元组中元素的出现次数
print(my_tuple.count(2))
#统计元素在元组中的位置
print(my_tuple.index(1))

输出结果:

(9,)
1
0

元组和列表二者十分相似,建议相互比较着看

(3)dict字典

#dict字典,用大括号来构造字典或者可以用dict()函数来构造字典
d = {'姓名':'张三','年龄':33,'子女':{'子':'张四','女':'张玲'}}
print(d)
d['年龄']
d.pop('子女')
print(d)

输出结果:

{'姓名': '张三', '年龄': 33, '子女': {'子': '张四', '女': '张玲'}}
{'姓名': '张三', '年龄': 33}

(4)Python中的集合

#在python中集合是一个无序排列的不重复序列的集合体
#(1)集合的创建
a = set('abcde')
print(a)
b = [1,2,2,2,3,5,6,6]
c = set(b)
print(list(c))
#discard函数无论集合中原本是否存在这个元素,都不会发生错误
#如果有则删除,如果没有则不会有变化
c.discard(3)
print(c)
a.update(b)
print(a)

输出结果:

{'c', 'd', 'b', 'e', 'a'}
[1, 2, 3, 5, 6]
{1, 2, 5, 6}
{'c', 1, 2, 3, 5, 6, 'd', 'b', 'e', 'a'}

Python在把字符串变成集合的过程中,不一定是按照字符串的顺序生成,而是随机的,复合我们数学定义中集合的概念,具有无序性。

(5)eval函数

#eval函数
#eval函数可以把其中的字符串按照python代码的形式执行
x = '12 + 23'
eval(x)

输出结果:

35

(6)find函数

#find函数

str = 'abcdefghijk'
ind = str.find('def')
print(ind)

输出结果:

3

find函数从字符串中查找子字符串,返回值为子字符串所在位置的最左端的索引,如果没有找到则返回-1,扩展的rfind()方法,表示从右向左查找。

(7)split函数

#split函数
#split函数的括号中是想要分割的方式,这里跟C语言的字符串处理函数很相近
str1 = "I am a student"
List1 = str1.split()
print(List1)
str2 = "1,2,3,4"
List2 = str2.split(',')
print(List2)

输出结果:

['I', 'am', 'a', 'student']
['1', '2', '3', '4']

split函数在C语言处理字符串的标准库中也有相似的用法。

(8)strip函数

#strip()函数
#strip函数用于去除字符串开头的结尾的空格字符(不包括字符串内部的空格)
str = "  今天很开心   "
print(str.strip())

输出结果:

今天很开心

(9)join函数

#join函数
#该函数可以看做是split函数的逆函数
List = ['I','am','a','student']
print(' '.join(List))

输出结果:

I am a student

.join前的字符串是用来连接list中的字符串的连接符号,此处是空格。

(10)lambda函数

#lambda函数
f=lambda x,y: abs(x)+y**3
print("f(-3,2)=" ,f(-3,2))

输出结果:

f(-3,2)= 11

(11)map函数

#map函数
#map函数的调用格式
#map函数接受一个函数func和一个列表,把函数func和一个列表
#把函数func依次作用在一个列表上,得到一个新的列表
a = map(pow,range(6),[3 for b in range(6)])
list(a)

输出结果:

[0, 1, 8, 27, 64, 125]

(12)reduce函数

#reduce函数的功能是在迭代sequence的过程中,首先把前两个元素传给函数参数
#函数加工后,把得到的结果和第三个元素作为两个参数传给函数参数
from functools import reduce
print(reduce(lambda x,y: x*y, range(1,6)))
print(reduce(lambda x,y: x+y, range(1,7)))

输出结果:
120
21

(13)filter函数

#filter函数
print(list(filter(lambda n: n%3 == 0,range(1,21))))

输出结果:

[3, 6, 9, 12, 15, 18]

按照我的理解filter本身是一种过滤函数。
filter的主要方法是通过function对iterable中的元素进行过滤。

(14)zip函数

#zip函数
a = range(1,5)
b = range(5,9)
c = range(10,13)
d= zip(a,b,c)
list(d)

 输出结果:

[(1, 5, 10), (2, 6, 11), (3, 7, 12)]

将多个列表或元组对应位置的元素组合,并返回这些元素的zip对象。
当对应位数不同时,整个取最小值。

(15)enumerate函数

a = [(1,5),(2,6),(3,7)]
for b in enumerate(a):
    print(b)

输出结果:

(0, (1, 5))
(1, (2, 6))
(2, (3, 7))

a = [(1,5),(2,6),(3,7)]
print([value[0] for (ind,value) in enumerate(a)])
print([value[1] for (ind,value) in enumerate(a)])

输出结果:

[1, 2, 3]
[5, 6, 7]

(16)列表推导式

#列表推导式
a = [[1,2,3],[4,5,6],[7,8,9]]
b = [d for c in a for d in c]
print(b)
a = [-1,-2,6,8,-10,3]
c = [i for i in a if(i > 0)]
print(c)
d = [(x,y) for x in range(5) if x%2 == 0 for y in range(5) if y%2 == 1]#都是前面的循环先执行
print(d)

输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[6, 8, 3]
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

这里的两个for循环书上并没有给太多的注释所以这里解释一下,这里的第一层循环for c in a是外循环,c就是每次从a中取出的一个元素,例如第一次取出的是【1,2,3】,for d in c 是第二层循环,从c中取出d。
最前面的d在两层循环的最外侧,表示在2次循环取出d后,把d的值放到列表中,即完成了对嵌套列表的平铺,即去括号,  这样的括号可以便于理解。
                                                      d {for c in a (for d in c)}
其中的for d in c 也可以改成判断条件,在列表推导式中使用多个循环,实现多序列元素的任意组合
,并且可以结合条件句过滤多余的元素。

(17)元组生成器推导式

#元组生成器推导式
#与列表推导式很相似,这里不再过多阐述
g1 = ((i + 1)**2 for i in range(6))
g2 = tuple(g1)
print(g2)

输出结果:

(1, 4, 9, 16, 25, 36)

这个与列表推导式很类似,可以比较着看。