python_day2 (2019-04-27)

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
增删改查
  • 增加(三种)
  1. append() 将指定元素添加至列表序列末尾
name_list = ['鲁班','xiaoming',1024]
str = input('请输入您要添加的内容')
name_list.append(str)
print('append()函数添加后',name_list)
# 运行结果
append()函数添加后 ['鲁班', 'xiaoming', 1024, '钟无艳']
  1. insert()在指定位置前插入元素
a = [0, 1, 2]
a.insert(1,10)
print(a)
# 运行结果 -----在1号位置插入数字10
[0, 10, 1, 2]
  1. 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”改为“小明”
  • 查找
    innotin 返回bool值
find_name = '小明'
if find_name in name_list:
    print('小明在列表中')
else:
    print('小明不在')

# 运行结果
小明在列表中
列表排序(两种)

sort()sorted()的区别

  1. sort()对原来的列表进行排序 而sorted()返回新的列表 原来的没有改变
  2. sort()属于列表的成员方法 sorted()对所有的迭代对象进行操作
  3. 语法描述: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一一对应

访问
  1. 根据键值key进行访问,访问不存在的键则会报错。
info = {'name': '刘强东','age': 45, 'id': 132741341735451,'addr': '北京'}
print(type(info))
# 访问 根据键进行访问的呢
print(info['name'])
# 访问不存在的键会报错
print(info['sex'])
# 运行结果
<class 'dict'>
刘强东
KeyError: 'sex'
  1. 因此当我们不确定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} 
  • 删除(三种)
  1. remove()函数,删除指定元素,若不存在则会报错。
  2. pop() 函数,随机删除集合中的一个元素
  3. 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}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354