Day_8-元祖、字典和集合

一、元祖(tuple)

1.什么是元祖(tuple)
定义:python提供的容器型数据类型,(元祖就是不可变的列表)
不可变:不支持增删改
有序:可以通过下标来获取元素

2.字面量和元素
(元素1,元素2,元素3....)
说明
元素:任何类型的数据,类型可互不相同,元素可重复

point = (100, 30)
print(point, type(point))  # (100, 30) <class 'tuple'>
注意:

情况1.空元祖

tuple1 = ()
print(type(tuple1))  # <class 'tuple'>

情况2.只有一个元素的元祖,在元素后面加逗号

tuple2 = (100,)
print(tuple2, type(tuple2))   # (100,) <class 'tuple'>

情况3.直接将多个元素用逗号隔开,不加括号表示也是一个元祖

tuple3 = 1, 2, 3
print(tuple3, type(tuple3))   # (1, 2, 3) <class 'tuple'>

3.元祖获取元素和列表一样
输出:一个元祖

tuple4 = ('成都', '达州', '绵阳', '南充', '广元')
# 获取单个元素
print(tuple4[1], tuple4[-1])  # 达州 广元
# 获取部分元素
print(tuple4[0:3])  # ('成都', '达州', '绵阳')
print(tuple4[::-1])  # ('广元', '南充', '绵阳', '达州', '成都')

# 遍历 -> 拿到的是元素本身
for city in tuple4:
    print(city)  

补充:特殊的获取方式
a.变量1, 变量2... = 元祖
说明:用前面的变量依次获取元素的值
要求:变量个数和元祖元素个数一致,不然程序会报错

point = (100, 200)
x, y = point   # x, y = (100, 200)  <==> x, y = 100, 200
print(x, y)  # 100 200

b.变量1, 变量2 = 元祖
说明:通过带
的变量获取元祖中剩余的部分
输出:*号是一个列表
注意:带*号的变量只能是一个,其他变量可以有多个

name, *scores = ('小张', 100, 200, 30, 3)
print(name, scores)  # 小张 [100, 200, 30, 3]

name, num, *scores = ('小张', 100, 200, 30, 3)
print(name, num, scores)  # 小张 100 [200, 30, 3]

*info, num = ('笑绽放', 100, 11, 333, 23)
print(info, num)  # ['笑绽放', 100, 11, 333] 23

说明:*的用法

作用:取元祖和列表中的数据

nums = (1, 2, 3)
print(*nums[::-1])  # 3 2 1

4.相关运算
+,*
in/not in
len(),max(),min(),sum(),tuple()

tuple1 = (1, 2, 4)
tuple2 = ('sd', 'dffd')
print(tuple2 + tuple1)  # ('sd', 'dffd', 1, 2, 4)
print(tuple2*2)  # ('sd', 'dffd', 'sd', 'dffd')

print('dff' in tuple2)  # False

5.排序
sorted(序列)
作用:对序列中的元素排序(升序)-从小到大
输出:新的列表(不管是什么序列,拍完后都是列表)

注意
列表.sort() 修改原列表中的元素的顺序
sorted - 产生一个新的列表

nums = (1, 34, 34, 5656)
print(sorted(nums))  # [1, 34, 34, 5656]
print(sorted('dfdfd'))  # ['d', 'd', 'd', 'f', 'f']

join函数
字符串特殊
字符串.join(序列)
作用:将序列中的元素取出,用指定的字符串连接在一起
要求:序列中的元素必须是字符串
*输入:序列
输出:字符串

new_str = ''.join(['d', 's', 't'])
print(new_str, type(new_str))   # dst <class 'str'>

list1 = [1, 33, 334, 2]
list1.sort()   # None  sort不会产生新的列表
print(list1)  # [1, 2, 33, 334]

二、字典(dict)

1.什么是字典?

定义:python提供的容器型数据类型(序列)
可变:支持增删改
无序:不支持下标操作,不能获取元素

2.字面量和元素

定义:用大括号括起来,里面有多个键值对,每个键值对用逗号隔开,
{key1:value, key2:value2, key3:value3...}
键值对就是字典的元素
键值对:键(key):值(value)
:不可变的,唯一,不可重复,一般将字符串作为key
:可以是任意类型的数据
注意
1.键值对必须成对出现,而且脱离字典单独出现没有意义
2.字典存数据,实际是通过值来存储的(key是值对应的标签和获取值的方式)
补充:列表和字典不可以作为key值

# 列表和字典不可作为key
dict1 = {}  # 空字典
dict1 = {'a': 134, 10: 11, (1, 2): 'abc'}
print(dict1)

# dict2 = {[1, 2]: 120}
# TypeError: unhashable type: 'list'
# 类型错误:列表不能希哈化

3.使用场景

什么时候用字典:
多个没有相同意义的数据(需要区分),可以通过key来区分多个数据的不同,
例如:保存一个人的不同信息,一辆车的不同信息
什么时候用列表:
存储的数据是具有相同意义的数据(不需要区分)
例如:储存一个班的学生信息,保存所有的价格

# 练习:申明一个变量,保存一个班的学生信息,每个学生需要保存姓名,电话,年龄
all_student = []
student1 = {'name': '小黄', 'tel': 111111, 'age': 18}  # 保存学生不同的信息
student2 = {'name': '小才', 'tel': 111111, 'age': 18}
student3 = {'name': '小四', 'tel': 111111, 'age': 18}
student4 = {'name': '小五', 'tel': 111111, 'age': 18}
all_student.append(student1)
all_student.append(student2)
all_student.append(student3)
all_student.append(student4)   # 保存学生到列表中
print(all_student[::-1])

4.字典元素的增删改查

a.查(获取值)
注意:字典中的键值对单独拿出来没有意义

1.字典[key]
目的:获取字典中key的值
注意:当key值不存在时,会报错 keyError

car = {'color': '黄色', 'type': '跑车', 'price': 500000}
print(car['color'])  # 黄色

2.字典.get(key)
目的:获取字典中key的
注意:当key不存在时,不会报错,并且取到一个默认值None
应用:可以判断key是否存在
字典.get(key, 值1)
目的:获取字典中key的值
注意:当key不存在时,不会报错,并且取到指定的值1

print(car.get('type'))  # 跑车
print(car.get('speed'))   # None

print(car.get('color', '红色'))  # 黄色
print(car.get('speed', 0))  # 0

如何选择:
确定时,用1,不确定时,用2或者3

3.遍历
注意:直接通过for - in 遍历字典取到的是key,然后通过key来取值

dict1 = {'a': 100, 'b': 200, 'c': 300}
# 遍历字典取到的是key(推荐使用)只需要遍历一次
for key in dict1:
    print(key)
    print(dict1[key])

# 遍历字典的values(),获取所有的值
for value in dict1.values():
    print(value)

# 遍历字典的items(),直接获取key和value(不建议使用)
for key, value in dict1.items():
    print(key, value)

b.增(增加键值对)、改
a.字典[key] = 值
目的
key不存在:添加键值对
key存在:修改key的值

movie = {'name':'xiaohua', 'type': '卡通', 'time': 120}

# 添加
movie['score'] = 7.9
print(movie)  # {'name': 'xiaohua', 'type': '卡通', 'time': 120, 'score': 7.9}

# 修改
movie['type'] = '相当搞笑'
print(movie)  # {'name': 'xiaohua', 'type': '相当搞笑', 'time': 120, 'score': 7.9}

c.删(删除键值对)
1.del 字典[key]
目的:删除指定的key对应的键值对

2.字典.pop(key)
目的:取出字典中key对应的值
注意:可以赋值给变量拿来使用

movie = {'name': 'xiaohua', 'type': '相当搞笑', 'time': 120, 'score': 7.9}
del movie['time']
print(movie)  # {'name': 'xiaohua', 'type': '相当搞笑', 'score': 7.9}

name = movie.pop('name')  # xiaohua
print(movie, name)  #  {'type': '相当搞笑', 'score': 7.9} xiaohua

应用实例

# 练习:用一个字典保存一个学生的信息:{'name': '张三', 'age': 30, 'score': 80}

student = {'name': '张三', 'age': 30, 'score': 80}
message = input('请输入要修改的信息:')
if message == 'name':
    new_name = input('请输入新的名字:')
    student['name'] = new_name
    print(student)
elif message == 'age':
    new_age = input('请输入新的年龄:')
    student['age'] = new_age
    print(student)
elif message == 'score':
    new_score = input('请输入新的分数:')
    student['score'] = new_score
    print(student)
else:
    print('没有该信息')

5.相关运算

1.比较运算
== !=
注意
判断两个字典是否相等:只看键值对是否一样,不管顺序
字典是不支持<和>符号

print({'a': 11, 'b': 22} == {'b': 22, 'a': 11})   # True

2. in / not in
key in 字典
目的:判断字典中指定的key是否存在
key not in 字典
目的:判断字典中指定的key是否不存在

dict2 = {'a': 1, 'b': 2, 'c': 3}
print('a' in dict2)   # True
print(1 in dict2)

3.len(),max(),min()

dict(数据)
要求
1.序列
2.序列中的元素都是有两个元素的子序列

# 获取字典中键值对的个数
dict2 = {'a': 1, 'b': 2, 'c': 3}
print(len(dict2))  # 3

# 获取字典中key的最大值/最小值
dict2 = {'a': 1, 'b': 2, 'c': 3}
print(max(dict2), min(dict2))    # c a

# 将列表转化为字典
print(dict([(1, 3), ('a', 'b')]))   # {1: 3, 'a': 'b'}

# 字典转列表/元祖/集合都是将字典中的key取出来作为列表/元祖/集合的元素
dict2 = {'a': 1, 'b': 2, 'c': 3}
print(list(dict2))  # ['a', 'b', 'c']

6.相关方法

1.字典.clear()

目的:清空字典(建议使用)
输入:字典
输出:空字典
建议:清空容器推荐clear操作,而不是重新赋一个空的容器
(会先删,在重新开辟空间)

dict2 = {'a': 1, 'b': 2, 'c': 3}
dict2.clear()
print(dict2, id(dict2))  # {} 5263296

# 只有本身不存在的时候,可以使用
dict3 = {}
print(id(dict3))  # 8552240
2.字典.copy()

目的:复制字典中的元素
输入:字典
输出:复制后的字典
注意:拷贝赋值,会产生新的地址,赋值后相互不影响

dict2 = {'a': 1, 'b': 2, 'c': 3}
dict3 = dict2.copy()
print(dict3)  # {'a': 1, 'b': 2, 'c': 3}
dict2['a'] = 100
print(dict2)  # {'a': 100, 'b': 2, 'c': 3}
print(dict3)  # {'a': 1, 'b': 2, 'c': 3}

# 赋值就是赋变量对应的地址
# 直接赋值,修改其中一个的元素,会影响另外一个

dict2 = {'a': 1, 'b': 2, 'c': 3}
dict3 = dict2
print(dict3)  # {'a': 1, 'b': 2, 'c': 3}
dict2['a'] = 100
print(dict2)  # {'a': 100, 'b': 2, 'c': 3}
print(dict3)  # {'a': 100, 'b': 2, 'c': 3}
3.dict.fromkeys(序列,值)

目的: 以序列中的所有元素作为key,指定的值作为value创建一个新的字典
即给多个key赋一样的值
输出:字典
输入:值只能是一个

new_dict = dict.fromkeys('abc', 100)
print(new_dict)  # {'a': 100, 'b': 100, 'c': 100}
4.
4.1 字典.keys()

目的:将字典所有的key取出来产生一个新的序列

4.2 字典.values()

目的: 将字典所有的value取出来产生一个新的序列

4.3 字典.items()

目的:将字典所有的key和value作为一个元祖取出产生一个新的序列

dict2 = {'a': 1, 'b': 2, 'c': 3}
print(dict2.keys())  # dict_keys(['a', 'b', 'c'])
print(dict2.values())  # dict_values([1, 2, 3])
print( dict2.items())  # dict_items([('a', 1), ('b', 2), ('c', 3)])
5.字典.setdefault(key, value = None)
5.1 字典.setdefault(key)

目的:当key值不存在时,添加键值对key:None

5.2 字典.setdefault(key, value = None)

目的:当key值不存在时,添加键值对key:value
注意:这个操作当key存在的时候,不会修改

dict2 = {'a': 1, 'b': 2, 'c': 3}
dict2.setdefault('name', '小胡')
dict2.setdefault('sex')
print(dict2)   # {'a': 1, 'b': 2, 'c': 3, 'name': '小胡', 'sex': None}
6.字典1.update(字典2)

目的:使用字典2中的键值对去更新字典1,
注意:如果字典2中的key,字典1中本来就存在就是修改,不存在就是添加

dict2 = {'a': 1, 'b': 2, 'c': 3}
dict2.update({'a': 22222, 'age': 18})
print(dict2)  # {'a': 22222, 'b': 2, 'c': 3, 'age': 18}

三、集合(set)

1.什么是集合?
可变
无序
元素是唯一并且不可变的

2.字面量
{元素1,元素2,元素3...}

set1 = {1, 32, 'abc'}
print(set1)  # {32, 1, 'abc'}

# 表示空集合
set2 = set()
print(type(set2))   # <class 'set'>

# 自带去重功能
set3 = {1, 2, 4, 3, 2, 1, 4}
print(set3)   # {1, 2, 3, 4}

# 使列表元素唯一
list1 = [1, 2, 3, 4, 2, 1]
list1 = list(set(list1))
print(list1)  # {1, 2, 3, 4}
3.增删改查
a.查
集合不能单独的获取单个元素,只能是一个一个的遍历
set1 = {1, 3, 33}
for item in set1:
    print(item)   
b.增

1.集合.add(元素)
目的:在集合中添加指定的元素

set1 = {1,3,33}
set1.add('哈哈')
print(set1)  # {1, 3, '哈哈', 33}

2.集合.update(序列)
目的: 将序列中的元素添加到集合中

set1 = {1, 3, '哈哈', 33}
set1.update('abc') 
print(set1)    # {1, 'a', 3, 33, 'b', 'c', '哈哈'}

set1.update({'ddd': 22323})
print(set1)   # {1, 'a', 3, 33, 'b', 'c', 'ddd', '哈哈'}
c. 删

集合.remove(元素)
目的:删除集合中指定的元素

set1 = {1, 3, 33}
set1.remove(33)
print(set1)
4.数学集合运算
a.交集(&)

目的:获取两个集合公共的部分,产生新的集合

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 & set2)  # {4, 5, 6}
b.并集(|)

目的:将两个集合中的元素合并在一起(去重后)产生一个新的集合

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7, 8}
c.补集(-)

目的:集合1 - 集合2 -> 去掉集合1中包含集合2的部分,剩下的产生一个新的集合

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 - set2)  # {1, 2, 3}
d.差集(^)

目的:将两个集合合并在一起,去掉公共部分,剩下的部分产生一个新的集合

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 ^ set2)  # {1, 2, 3, 7, 8}
e.子集的判断:

集合1 > 集合2
目的: 判断集合1中是否包含集合2
集合1 < 集合2
目的:判断集合2中是否包含集合1
输出:布尔值

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}

print({1, 2, 3} > {1, 2})  # True
print({1, 2, 3} > {1, 2, 0})  # False

print({1, 2, 3} > {1, 2, 3})  # False
print({1, 2, 3} >= {1, 2, 3})  # True
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容