python基本语法 2
本章主要讲述了列表、元组、集合和字典四种数据类型以及基本操作方法。
Part 1 列表(List)
所谓列表,可以理解为增强版的数组,和数组不一样的是,c语言的数组只能存储一种数据类型的数据,而一个列表内可以存储不同类型的数据。
示例
# 声明一个列表 显示其类型
name_list = ['鲁班','xiaoming',1024] # 列表的三个元素分别为string,string,int
print(name_list)
print(type(name_list))
#运行结果
['鲁班', 'xiaoming', 1024]
<class 'list'>
列表元素访问 & 遍历
- 列表的访问可以类比字符串,使用下标索引进行访问,同样也可以用中括号的方式进行片段截取。
- 当采用for循环进行遍历时,list本身可以作为一个迭代对象。
# 语法描述
# for name in name_list:
# print(name)
i = 0;
while i <len(name_list):
print(name_list[i])
i += 1
# 运行结果
鲁班
xiaoming
1024
增删改查
- 增加(三种)
- append() 将指定元素添加至列表序列末尾
name_list = ['鲁班','xiaoming',1024]
str = input('请输入您要添加的内容')
name_list.append(str)
print('append()函数添加后',name_list)
# 运行结果
append()函数添加后 ['鲁班', 'xiaoming', 1024, '钟无艳']
- insert()在指定位置前插入元素
a = [0, 1, 2]
a.insert(1,10)
print(a)
# 运行结果 -----在1号位置插入数字10
[0, 10, 1, 2]
- extend()将另外一个序列中的元素逐一添加至列表末尾
a = [1, 2]
b = [3, 4]
a.append(b)
print("append()函数添加后: ",a)
a.extend(b)
print("extend()函数添加后:",a)
append()函数添加后: [1, 2, [3, 4]]
extend()函数添加后: [1, 2, [3, 4], 3, 4]
通过对比我们可以发现:append()是把序列b作为一个元素整体放在列表a的末尾;而extend()则是把序列b拆开,把每个元素作为一个单独个体插入至列表a的末尾。
-
删除(三种)
del 根据元素下标删除
remove() 根据元素的值进行删除
pop() 删除最后一个元素
#del 根据元素下标删除
print('删除前:',name_list)
del name_list[0];
print('del删除后:',name_list)
#remove 根据元素的值进行删除
name_list.remove('xiaoming')
print('再由remove()删除后:',name_list)
#pop 删除最后一个元素
name_list.pop()
print('再由pop()删除后:',name_list)
# 运行结果
删除前: ['鲁班', 'xiaoming', 1024, '钟无艳']
del删除后: ['xiaoming', 1024, '钟无艳'] # 删除了0号位元素“鲁班”
再由remove()删除后: [1024, '钟无艳'] # 删除了指定元素“xiaoming”
再由pop()删除后: [1024] # 删除最后一个元素
- 修改
name_list[1] = '小明'
print(name_list)
# 运行结果
['鲁班', '小明', 1024, '钟无艳'] # 把“xiaoming”改为“小明”
-
查找
in 和 notin 返回bool值
find_name = '小明'
if find_name in name_list:
print('小明在列表中')
else:
print('小明不在')
# 运行结果
小明在列表中
列表排序(两种)
sort()和 sorted()的区别
- sort()对原来的列表进行排序 而sorted()返回新的列表 原来的没有改变
- sort()属于列表的成员方法 sorted()对所有的迭代对象进行操作
- 语法描述:ls.sort(key reverse) sorted (ls)
# 导入的语法形式 from modename import name1 ,name2
num_list =[] # 建立一个空列表
for i in range(10):
num_list.append(randint(-10,10)) # 产生随机整数 [-10, 10]
print(num_list)
num_list.sort()
print('正序排序:',num_list)
num_list.sort(reverse = True)
print('逆序排序:',num_list)
new_list = sorted(num_list)
print(num_list)
print(new_list)
# 运行结果
[-8, 6, 9, -5, 6, 3, 6, -8, 2, -3] # 原列表
正序排序: [-8, -8, -5, -3, 2, 3, 6, 6, 6, 9]
逆序排序: [9, 6, 6, 6, 3, 2, -3, -5, -8, -8]
# 经过sorted()排序,原列表未发生变化
[9, 6, 6, 6, 3, 2, -3, -5, -8, -8]
# 排序后结果
[-8, -8, -5, -3, 2, 3, 6, 6, 6, 9]
列表嵌套
所谓嵌套,即列表的元素仍然是一个列表,其访问类似于多维数组访问。
# 列表的嵌套 列表里面的元素还是列表。
school_name = [['qinghua','beida'],['nankai','tianda'],['dongqin','yanda']]
print(school_name)
print(school_name[0][1])
print(school_name[0, 1])
# 运行结果
[['qinghua', 'beida'], ['nankai', 'tianda'], ['dongqin', 'yanda']]
beida
列表推导式
所谓列表推导式,就是指轻量级的循环创建,需多加练习。下面给出两个样例。
- 选出大于0的数据
#生成10个元素,范围在【-10, 10】之间的列表
from random import randint
l = [randint(-10, 10) for _ in range(10)]
print(l)
# 选出大于0的数据
result = []
for x in l:
if x>=0:
result.append(x)
print('使用for循环筛选',result)
# 循环的过程使用if
result2 = [x for x in l if x >= 0]
print('使用列表解析筛选',result2)
# 运行结果
[4, -7, 1, 0, -4, -6, -3, 6, -2, -8]
使用for循环筛选 [4, 1, 0, 6]
使用列表解析筛选 [4, 1, 0, 6]
- 筛选偶数数据
number = [i for i in range(11)]
print(number)
# 1. for循环
res = []
for x in number:
if x%2 == 0:
res.append(x)
print('使用for循环筛选',res)
# 2. 列表推导式
res2 = [x for x in number if x%2 ==0]
print('使用列表解析筛选',res2)
# 运行结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
使用for循环筛选 [0, 2, 4, 6, 8, 10]
使用列表解析筛选 [0, 2, 4, 6, 8, 10]
其他操作
- 列表转化为字符串
# 列表转化为字符串
my_list = ['Welcome', 'to', 'ML','World']
# my_list_to_str = str(my_list)
# print(my_list_to_str)
print(' '.join(my_list)) # 需细细体会这个操作
# 运行结果
Welcome to ML World
- 列表和字符串的 * 运算
# 列表和字符串的 *
str1 = 'hehe' * 3
print(str1)
list4 = ['6', 9, 0, 3, 14] *3
print(list4)
# 运行结果
hehehehehehe
['6', 9, 0, 3, 14, '6', 9, 0, 3, 14, '6', 9, 0, 3, 14]
Part 2 元组(Tuple)
元组数据不能修改,包括删除。
访问示例
# 元组
a = ('ddd',111,0.88)
#tuple
print(a)
print(type(a))
# 序列: ;列表/字符串/元组
# 访问
print(a[0])
# 运行结果
('ddd', 111, 0.88)
<class 'tuple'>
ddd
0
-
特例
要注意单个元素不是元组 除非加上逗号
b = (211221)
print(type(b))
s = ('a',)
print(type(s))
# 运行结果
<class 'int'>
<class 'tuple'>
zip
zip用于将 可迭代对象作为参数,将对象中的对应元素打包成一个元组, 然后返回这些元组对象,以节约内存。
# 同时遍历两个列表
a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]
zipped1 = zip(a, b)
print(zipped1)
print(list(zipped1))
# 长度不一致时,以最短的对象为准
zipped2 = zip(a, c)
print(list(zipped2))
heros = ['后羿','安琪拉']
sskill = ['惩戒之箭','烤串']
for hero,skill in zip(heros,sskill):
print(hero,'--------->',skill)
# 运行结果
<zip object at 0x7f1e6925ff48>
[(1, 4), (2, 5), (3, 6)]
[(1, 4), (2, 5), (3, 6)]
后羿 ---------> 惩戒之箭
安琪拉 ---------> 烤串
【注】当被打包的序列长度不一致(即无法做到一一对应组合)时,以最短的对象为准。参考上例中zipped2.
Part 3 字典(Dict)
字典即每个value都与一个key一一对应
访问
- 根据键值key进行访问,访问不存在的键则会报错。
info = {'name': '刘强东','age': 45, 'id': 132741341735451,'addr': '北京'}
print(type(info))
# 访问 根据键进行访问的呢
print(info['name'])
# 访问不存在的键会报错
print(info['sex'])
# 运行结果
<class 'dict'>
刘强东
KeyError: 'sex'
- 因此当我们不确定map中是否含有某个键时,可以使用get()函数。若存在,则输出,若不存在,可指定默认值。
# get() 若存在,则输出,若不存在,可指定默认值
age = info.get('age',10)
print(age)
mail = info.get('mail','132@jingdong.com')
print(mail)
# 运行结果·
45 # 这是字典中所含有的
132@jingdong.com # 这是字典中不存在的,并由get()函数制定的默认值
增删改查
- 增加 & 修改
# 修改
info['name'] = '马云'
print(info)
# 添加
info['sex'] = '男'
print('添加后:', info)
# 运行结果
{'name': '马云', 'age': 45, 'id': 132741341735451, 'addr': '北京'}
添加后: {'name': '马云', 'age': 45, 'id': 132741341735451, 'addr': '北京', 'sex': '男'}
其他常用操作
- len()函数 ------ 返回 <k,v> 键值对的个数
- keys()函数 & values()函数 & items()函数 -------分别以列表形式返回所有的key、value和<key,value>
keys = info.keys()
print(keys)
item = info.items()
print(item)
# 运行结果
dict_keys(['name', 'age', 'id', 'addr'])
dict_items([('name', '刘强东'), ('age', 45), ('id', 132741341735451), ('addr', '北京')])
Part 4 集合(Set)
集合的特性是:无序性、唯一性,常用于去重。
示例
set1 = {1, 1, 2, 5, 4, 3}
print(type(set1))
print(set1)
# 运行结果
<class 'set'>
{1, 2, 3, 4, 5} # 重复的数字1已经被自动删除
增删改查
-
增加 add()
将数字“8”添加至集合序列的末尾。
set1.add(8)
print(set1)
# 运行结果
{1, 2, 3, 4, 5, 8}
- 删除(三种)
- remove()函数,删除指定元素,若不存在则会报错。
- pop() 函数,随机删除集合中的一个元素
- discard()函数,删除指定元素,存在则删除,不存在则无操作。
# remove()函数
set1.remove(1)
print(set1)
# pop()函数
set1 = {1, 2, 5, 4, 3}
set1.pop()
print(set1)
# discard()函数
set1.discard(3)
print(set1)
set1.discard(3)
print(set1)
# 运行结果
{2, 3, 4, 5, 8} # 使用remove()删除1
{3, 4, 5, 8} # 使用pop()删除左边第一个元素
{4, 5, 8} # 使用discard()删除数字3
{3, 4, 5, 8} # 使用discard()再次删除数字3,因为3已经不存在,所以无操作
【注】虽然说set.pop()是随机删除集合中的一个元素,但是只当集合元素是字符串类型时,并且在脚本运行(CMD)时才会随机删除,而在交互式环境(IDE)中是保持删除左边第一个元素的。如果集合元素是其他数据类型时,也是删除左边第一个元素的。
改查
这两个操作可类比其他,不做赘述。
Part 5 附录
1. 分配工作
【问题描述】1个学校 有3个办公室,现有8位老师等待工作分配,请使用列表(List)操作完成随机分配
import string
from random import randint
# 或者 import random.randint as randint
# 定义三个办公室
offices =[[], [], []]
# 定义8位老师
names = list(string.ascii_uppercase[:8])
print(names)
for name in names:
# [0, 2] 产生一个随机数
index = randint(0, 2)
offices[index].append(name)
print(offices)
i = 1
for tempNames in offices:
print("办公室{}里面一共有{}个人".format(i,len(tempNames)))
i += 1
print('成员为:',end='')
for name in tempNames:
print('{} '.format(name),end ='')
print('')
print('-' * 30)
# 运行结果
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
[['A'], ['B', 'G'], ['C', 'D', 'E', 'F', 'H']]
办公室1里面一共有1个人
成员为:A
------------------------------
办公室2里面一共有2个人
成员为:B G
------------------------------
办公室3里面一共有5个人
成员为:C D E F H
------------------------------
字典解析 & 集合解析
练习使用推导式。
# 字典解析
# 创建一个班级的分数
from random import randint
grades = {'Student{}'.format(i):randint(50, 100)for i in range(1, 21)}
print(grades)
# 筛选出高于90分的人
data = {k:v for k, v in grades.items() if v>= 90}
print('高于90分的人:\n',data)
# 集合解析
set1 = {randint(0,20)for _ in range(20)}
print(set1)
# 找到被3整除的
res = {x for x in set1 if x%3 == 0}
print('能够被3整除的:',res)
# 运行结果
{'Student1': 69, 'Student2': 72, 'Student3': 51, 'Student4': 71, 'Student5': 84, 'Student6': 76, 'Student7': 67, 'Student8': 77, 'Student9': 77, 'Student10': 54, 'Student11': 68, 'Student12': 61, 'Student13': 53, 'Student14': 78, 'Student15': 82, 'Student16': 76, 'Student17': 69, 'Student18': 67, 'Student19': 91, 'Student20': 86}
高于90分的人:
{'Student19': 91}
{0, 1, 3, 5, 6, 8, 11, 13, 14, 15, 17, 18, 19, 20}
能够被3整除的: {0, 3, 6, 15, 18}