python基础——5(元组、字典、集合)
上节复习:
# 数字类型
# int:py3|py2 long:py2
# float: 3.14
# complex(5, 4) => 5 + 4j
num = 123456789012345678901234567890123456789012345678901234567890
print(num)
print(int('123'))
# 字符串:*******
# '' "" """"""
# len() [index] [::]
# 列表类型
# [1, 3.14. 'abc', True, []]
# len() [index|-index] [::] => 有序,存放多个值
# 增删改查
# 可变不可变类型
# 不可变:在id不改变的情况下,无法修改值
# 可变:在id不改变的情况下,可以修改(内部)值
a = [1, 2]
print(id(a))
a = [3, 4]
print(id(a))
# 今日内容
# 元组 ***
# 字典 *****
# set *
一、元组
1、定义:
t1 = () #元组一旦定义不可改变,不要定义空的元组
#参数为for可以循环遍历的对象(可迭代对象)
t2 = tuple("123")
print(t2,type(t2))
t3 = tuple([1,2,3])
print(t3,type(t3))
t4 = tuple((7,8,9))
print(t4,type(t4))
# 思考:如何定义一个只有一个值的元组
# “Owen”
print(("Owen",))
print(tuple(['Owen']))
# 总结
t = (1,2,3)
t = (1,)
# 常用操作
# 元组有序存储
# 按索引取值
t = (1,2,3,2,3,2)
print(t[1])
print(t[-2])
# 切片
print(id(t))
nt = t[:-1:]
print(nt,id(nt))
# 长度(item元素个数)
print(len(t))
# 元组内置方法
print(t.count(2)) # 该数据集合可以存放相同数据
print(t.index(2,2,3)) # ValueError: tuple.index(x): x not in tuple
# 案例一:
# 有一个老师老师列表,打算开除,如果是校长亲友团,免开
# 原始列表为list类型
# 手动输入是否是亲友团,决定是否开除
teas = ['Bob','Alex']
friends = input("亲友团[0,1]:")
if friends == '1'
teas = tuple(teas)
#判断teas对象是否是tuple类型
if not isinstance(teas,tuple): #老师是否是亲友团,不是就删除
teas.clear()
for t in teas:
print("在职老师 %s" % t)
# 案例二:
# 元组中的数据一定不能改变,但是元组中的数据(可变类型)的数据可以改变
t1 = (1,2,'abc',True,(1,2)) # t1永远无法改变
t2 = (1,2,[])
print(t2,type(t2),id(t2),id(t2[2]))
t2[2].extend((10,20))
print(t2,type(t2),id(t2),id(t2[2]))
二、字典
特别了解:dict是python中仅存的mapping类型
1、声明
dict的key:可以为所有不可变类型(int float tuple str bool None),一般采用字符串
dict的value:可以为所有数据类型
注:key具有唯一性(重复会覆盖旧值),value可以重复
dic = {1: None, None: None, 3.14: None, True: None, 'abc': None, (1,): None, None: 12345 } print(dic)
# 定义字典的三种方式
# 1
d1 = {'name':'Owen','age':18}
# 2
d2 = dict({'name':'Owen','age':18})
# 3
d3 = dict(name = 'Egon',age = 58)
字典存储数据是无序的,没有索引与切片,用key来取值
2、增删改查
dic = {}
# 增:key不存在
# 第一种
dic['name'] = 'Mac'
print(dic)
# 第二种:添加的参数字典,与dic可以重复,就是更新值,新key就是新增
dic.update({'a': 100, 'c': 300})
print(dic)
# 改:key已存在
dic['name'] = 'Big Mac'
# 查
print(dic['name'])
# 删
# 第一种
del dic['name']
print(dic)
# 第二种
res = dic.pop('c') # 根据key删除指定对象,并返回删除的对象的value
print(res)
3、get取值(*****)
dic = {'a':10,'b':20}
# print(dic['c']) # KeyError
res = dic.get('c') # 拥有默认值,None,可以避免报错
print(res)
res = dic.get('d','key不存在') # 可以自定义默认值
print(res)
# 随即删除,返回值是(key,value)
print(dic)
print(dic.popitem())
print(dic.popitem())
print(dic)
# 如何定义一个空字典
# 第一个参数:keys:list|tuple|str,第二个参数:统一的默认value
d10 = {}.fromkeys(['a','b','c'], '')
print(d10) # {'a': '', 'b': '', 'c': ''}
# 独自设置默认值
d11 = {'a':10,'teas':['Owen']}
# 添加老师
# 如果有teas,在原teas基础上添加老师,如果没有,新建一个空teas
if 'teas' not in d11:
d11['teas'] = []
d11['teas'].append('Egon')
d11['teas'].append('LiuXX')
print(d11)
# 原d11中,如果有teas这个key,setdefault相当于什么都没干
# 如果没有,就将第二个参数(默认值)传给teas存放到d11中
# 用setdefault实现上面的代码
d11.setdefault('teas',[])
d11['teas'].append('Egon')
d11['teas'].append('LiuXX')
print(d11) #{'a': 10, 'teas': ['Owen', 'Egon', 'LiuXX']}
# 字典的定义:{} | dict()
# 字典的常用操作:增删改查
# 字典的内置方法:
# 字典的循环(迭代)
dic = {'a':10,'b':20,'c':30}
# 直接for循环(遍历)字典得到的是key
for k in dic:
print(k,dic[k])
#或者使用.keys()方法得到存放key的集合
keys = dic.keys()
print(keys,type(keys)) # dict_keys(['a', 'b', 'c']) <class 'dict_keys'>
for k in keys: # 遍历key,跟直接遍历字典是一样的
print(k)
# 只循环值
values = dic.values()
print(values,type(values)) # dict_values([10, 20, 30]) <class 'dict_values'>
for v in values: #遍历值
print(v)
#存放key-value的键值对关系
K_vs = dic.items()
print(k_vs,type(k_vs)) # dict_items([('a', 10), ('b', 20), ('c', 30)]) <class 'dict_items'>
# 同时遍历k-v
for k,v in dic.items():
print(k,v)
# dic.values() | dic.keys() | dic.items() 不是原生list,不能直接索引取值,但可以for循环取值
vs = list(values) #转为列表,按索引取值
print(vs[1])
for v in vs: # 循环取值
print(v)
#多级字典嵌套
'''info1 = {
"1":{"4":["aaa","bbb"]},
"2":{"5":["ccc","ddd"]},
"3":{"6":["eee","fff"]}
}
# info1["1"]["4"][1] = "ggg" #{'2': {'5': ['ccc', 'ddd']}, '1': {'4': ['aaa', 'ggg']}, '3': {'6': ['eee', 'fff']}}
# print(info1.keys()) #打印键值
# print(info1.values()) #打印有效值
info1.setdefault("4",{"7":["xxx","zzz"]}) #如果找到键值直接返回,没找到就插入后面的有效值
print(info1) #{'4': {'7': ['xxx', 'zzz']}, '2': {'5': ['ccc', 'ddd']}, '3': {'6': ['eee', 'fff']}, '1': {'4': ['aaa', 'bbb']}}
print(info1)'''
# 案例: 不区分大小写,计算每一个名字出现的次数,记录在字典中
ls = ['Owen', 'owen', 'Egon', 'LiuXX', 'Liuxx', 'egon', 'egon']
# 第一种方法
name_dic = {}
for name in ls:
# 名字全小写,不用区分大小写
name = name.lower()
# 名字是否在字典中存在:存在 - 次数+1 | 不存在 - 添加并设置初值1
if name not in name_dic:
#不存在
name_dic[name] = 1
else:
#存在
name_dic[name] += 1
print(name_dic)
# 第二种方法
name_dic = {}
for name in ls:
name = name.lower()
# name已存在,返回key的值;不存在,把key插入字典中,返回指定的默认值
name_dic.setdefault(name,0)
name_dic[name] += 1
print(name_dic)
三、集合
1、定义与声明
# 什么是set: # i) 单列数据集合:str,list,tuple,set 双列:dict # ii) 无序存储:无key无index,无法取值 # iii) 可变数据类型,内部可以存放任意类型数据,但数据具有唯一性 *****
# {}代表空字典,用set()来创建空集合 s1 = set() print(s1,type(s1)) #set() <class 'set'> s2 = set('abc') print(s2,type(s2)) #{'b', 'a', 'c'} <class 'set'>
2、内置方法与使用——集合间的运算(& | ^ - > < ==)
p_set = {'a','b','c','egon'} # {'a', 'c', 'b', 'egon'}
l_set = {'x','y','z','egon'} #{'z', 'egon', 'x', 'y'}
# 交集 &
res = p_set & l_set
print(res) # {'egon'}
res = p_set.intersection(l_set)
print(res) # {'egon'}
# 并集
res = p_set | l_set
print(res) #{'y', 'x', 'egon', 'c', 'z', 'b', 'a'}
res = p_set.union(l_set)
print(res)
# 差集:在p中不在l中
res = p_set - l_set
print(res) #{'b', 'c', 'a'}
res = p_set.difference(l_set)
print(res)
# 对称差集:除去公共的部分
res = p_set ^ l_set
print(res) # {'a', 'x', 'c', 'y', 'z', 'b'}
res = p_set.symmetric_difference(l_set)
print(res)
# 值更新的差集
print(p_set) #{'c', 'egon', 'a', 'b'}
print(l_set) #{'x', 'egon', 'z', 'y'}
p_set.difference_update(l_set) # 将运算结果赋值给调用者
p_set = p_set - l_set
print(p_set) # {'c', 'a', 'b'} #原值已更新
print(l_set) # {'egon', 'z', 'y', 'x'}
# 添加删除操作
s = set()
s.add('abc') #添加一项
s.update('s','d','f') #添加多项
s.add('xyz')
print(s) #{'d', 'abc', 'xyz', 'f', 's'}
res = s.pop() # 随机删除一个element元素,并将其返回
print(res)
if 'xyz' in s:
s.remove('xyz') # 有element删除,没有就抛异常
print(s) # {'abc', 's', 'f', 'd'}
#删除不存在的元素不会报错;返回None
s.discard('abc') # {'d', 'f', 's'}
print(s)
list_1 = [1,4,5,7,3,6,7,9]
list_1 = set(list_1) #转为集合去重,集合也是无序的
list_2 = set([2,6,0,66,22,8,4])
#子集
print(list_1.issubset(list_2))
#父集
print(list_1.issuperset(list_2))
#判断是否有交集
print(list_2.isdisjoint(list_1)) #如果两个集合没有交集,则返回True
# 了解:父子set
sup_set = {1, 2, 3, 4, 5}
sub_set = {1, 2, 3}
temp_set = {3, 2, 1}
flag_set = {7, 8, 9}
print(sup_set > sub_set)
print(sup_set < sub_set)
print(temp_set == sub_set)
# 两个set是否没有交集
res = flag_set.isdisjoint(temp_set)
print(res)
res = temp_set.isdisjoint(sup_set)
print(res)
# 案例与应用场景
# 选课
class_map = [
('owen', 'python'),
('egon', 'linux'),
('egon', 'python'),
('liuxx', 'python'),
('liuxx', 'java')
]
# 需求:
# 1.多少人参加了选课: ['owen', 'egon', 'liuxx']
# 2.都选了哪些课程: ['python', 'linux', 'java']
# 利用逻辑代码去重
names = []
for name,_ in class_map:
#判断列表中是否存在,不存在就添加
if name not in names:
names.append(name)
print(names) #['owen', 'egon', 'liuxx']
# 利用集合去重
classes = set()
for _,cless in class_map:
classes.add(cless)
print(classes) #{'java', 'linux', 'python'}
python基础——5(元组、字典、集合)的更多相关文章
- python中列表 元组 字典 集合的区别
列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计 ...
- **python中列表 元组 字典 集合
列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. 1.列表 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔. 列表的特 ...
- python基础之元组,集合
一.元组 为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(,[,],,)) #t=tuple((,[,],,))) print(type(t)) 元组可以作为字典的key d={(,, ...
- Python基础2 列表 字典 集合
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- python基础-列表元组字典
1.列表和元组 列表可以对数据实现最方便的存储.修改等操作 names=["Alex","tenglan","Eric","Rai ...
- python3速查参考- python基础 4 -> 元组 + 字典 + 字符串 的学习
元组 元组:特点就是内容不可变,算只读的列表,可以被查询,不能被修改 a = 2, print(a) print(type(a)) b = ('a','b','c') print(b[1]) 运行结果 ...
- python 中列表 元组 字典 集合的区别
先看图片解释 (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复 ...
- python的列表元组字典集合比较
定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的 eg:aList=[123,'abc',4.56,['inner','list'],7- ...
- python 深浅拷贝 元组 字典 集合操作
深浅拷贝 :值拷贝 :ls = [,,] res = ls 则print(res)就是[,,] 浅拷贝 :ls.copy() 深拷贝:ls3 = deepcopy(ls) # 新开辟列表空间,ls列表 ...
- python基础(4)-元组&字典&字符串&队列
元组(tuple) #元组相对列表来说不同之处是只读不可写 读操作和列表一致 letter_tuple = ('a','b','c','d'); print(letter_tuple[0]);#res ...
随机推荐
- AtCoder Grand Contest 017 B
B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stateme ...
- UVa 1218 Perfect Service 完美的服务
***状态设计值得一看dp[u][0]表示u是服务器(以下v均指任意u的子结点,son指u的所有子结点)ap[u][0]=sum{dp[v][1]}+1//错误,服务器是可以和其他服务器相邻的dp[u ...
- Codeforces Round #324 (Div. 2)
CF的rating设置改了..人太多了,决定开小号打,果然是明智的选择! 水 A - Olesya and Rodion #include <bits/stdc++.h> using na ...
- 486 Predict the Winner 预测赢家
给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,…….每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没有剩余分数 ...
- 深入理解spark streaming
spark streaming是建立在spark core之上的,也就说spark streaming任务最终执行还是依赖于RDD模型.在转化成最终的RDD模型执行前,spark streaming主 ...
- 【经验总结】北邮OJ
90. 字符串转换 时间限制 1000 ms 内存限制 65536 KB 题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而" ...
- 在Android上使用酷狗歌词API
参考自http://blog.csdn.net/u010752082/article/details/50810190 代码先贴出来: public void searchLyric(){ final ...
- 微软将于12月起开始推送Windows 10 Mobile
[环球科技报道 记者 陈薇]据瘾科技网站10月8日消息,根据微软Lumia官方Faceboo发布的消息,新版系统Windows 10 Mobile 将会12月起陆续开始推送. 推送的具体时程根据地区. ...
- Window.Event.KeyCode的含义
Window.Event.KeyCode=13的含义(转载) 2011-04-16 09:41:18| 分类: html | 标签:keycode event realkey var do ...
- Android(java)学习笔记171:服务(service)之绑定服务调用服务里面的方法
1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 : bindServ ...