Python入门笔记—第五章(元祖tuple,集合set,字典dict)

第五章:元祖tuple,集合set,字典dict

1.元祖—tuple( )

  • 有序

  • 可以访问,但是不能修改(指内容不可修改)

  • 元祖数据可以是任意类型,如(1,2,"abc",'a',[1,2,3])

  • 列表list能用的操作,除了修改,元祖都能用,即索引,分片,相加,相乘等都能通用

1.1 常用操作

  • 索引(和List相同)
a = (1,2,3,4,5)
print(a[4])
print(a[12])  #索引不可以超标

结果:5

       报错

问题:为什么不能用 a = (i for i in range(1,5)),这个形式创建元祖?

  • 切片
a = (1,2,3,4,5)
print(a[0:3])
print(a[0:100])  #切片可以超标
结果:
(1, 2, 3)
(1, 2, 3, 4, 5)
  • 相加、相乘
a = (1,2,3,4,5)
b = (1,2,3)
c = a + b
d = a * 3

print(c)
print(d)

结果:

(1, 2, 3, 4, 5, 1, 2, 3)
(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
  • 遍历(单层)
a = (1,2,"aabbcc","ncu","dddaa")
for i in a:
    print(i)

结果:

1
2
aabbcc
ncu
dddaa
  • 遍历(双层)
a = ((1,2,3),("aa","bb","cc"),("dd",4,"ee"))
for i in a:
    print(i)
for k,v,j in a:
    print(k,v,j)

结果:

(1, 2, 3)
('aa', 'bb', 'cc')
('dd', 4, 'ee')
1 2 3
aa bb cc
dd 4 ee

1.2 常用函数

  • len、max、min 用法与列表list一致

  • count、index

a = (1,3,5,6,33,55,66,3,3)
print(a.count(3))
print(a.index(3))   #如果要索引的是多个值,则返回第一个值
  • 其余列表list能用的函数,元祖tuple基本上都能通用

结果:

3
1   

1.3 元祖没有内涵操作

  • 即 a = (i for i in range(1,10))

  • 会报错

1.4 附—两个变量交换

  • C、JAVA、C++等语言的写法和Python写法的区别
a = 1
b = 3

#####C/C++/JAVA写法:
t = a 
a = b
b = t

Python的写法:
a,b = b,a

2.集合—set{ }

  • 和高中集合概念一致,即无序,值唯一

  • 因为集合无序,值唯一,因此无法使用索引,分片,count等函数

2.1 集合的定义

  • 两种方法
#第一种
a = set()
print(a)
print(type(a))

#第二种,其中大括号内一定要有值,否则定义的会是一个dict
a = {1,2,3,4,5,}
print(a)
print(type(a))

#大括号内没有值的情况
a = {}
print(a)
print(type(a))

结果:

set()
<class 'set'>
{1, 2, 3, 4, 5}
<class 'set'>
{}
<class 'dict'>

2.2 集合的特征

  • 无序,即无法使用索引、分片、count等函数

  • 唯一,可以利用该特征来排除重复值

a = {1,2,3,4,1,1,1,1,1}
print(a)

结果:

{1, 2, 3, 4}
  • 集合内的数据只能放置可哈希的数据,如int、str、list、tuple、冰冻集合等

2.3 集合的遍历以及内涵

  • 集合的遍历和内涵操作与列表list一致
a = {1,2,3,4,5,66,66,66,77,7,8,6,9,10}
print(a)

for i in a:
    print(i,end = " ")
print(" ")

b = {i for i in a if i % 2 == 0}
print(b,end = " ")

结果:

{1, 2, 3, 4, 5, 66, 7, 8, 6, 9, 10, 77}
1 2 3 4 5 66 7 8 6 9 10 77  
{2, 66, 4, 6, 8, 10} 

2.4 关于集合的函数

  • len,max,min与列表list一直,不再重复

  • add,clear

#add,在集合内添加元素
a = {1,2,3}
print(id(a))

a.add(123)
print(id(a))
print(a)

#clrar,清空元素
a = {1,2,3}
print(id(a))
a.clear()
print(id(a))
print(a)
结果:#表明函数add和函数clear为原地操作
140431563811976
140431563811976
{123, 1, 2, 3}
140431563812648
140431563812648
set()
  • pop,remove,discard
# pop,在列表list中是删除队尾的元素,一般伴随赋值操作,
# pop,在集合set中是随机删除一个元素
a = {1,2,3,4}
print(id(a))
a.pop()
print(a)
print(id(a))

结果:

140431563811976
{2, 3, 4}
140431563811976
  • 在实际测试中,执行多次,但是函数pop删除元素并不随机,只是删除了元素1,是因为pop本身就不是随机删除还是因为丘比特笔记本的原因?有待深究

  • 函数pop为原地操作

#remove,删除集合中特定的值,如果该值不存在于集合中则报错,原地操作
a = {1,2,3,44,55}
print(id(a))
a.remove(44)

print(id(a))
print(a)

#discard,删除集合中特定的值,与remove不同的是,如果该值不存在与集合中不会报错,原地操作
b = {11,22,33,44,55}
print(id(b))

b.discard(44)
print(id(b))
print(b)

b.discard(66)
print(id(b))
print(b)

结果:

140431702354856
140431702354856
{1, 2, 3, 55}
140431554061704
140431554061704
{33, 11, 22, 55}
140431554061704
{33, 11, 22, 55}

思考:为啥remove不存在的值会报keyerror?

  • copy,与列表list操作一致,并且为浅拷贝,此处不重复

3 字典dict

  • 没有顺序的组合数据,数据以键值对呈现

  • 创建字典有很多种方法,一般情况下挑一种自己经常用的(第二种带冒号的),其余的自己能够认识就行

3.1 字典的创建方法

  • 有以下几种常用的方法:

  • 创建空字典

#创建空字典1
a = {}
print(a)
#创建空字典2
a = dict()
print(a)

结果:

{}
{}
  • 创建有值的字典,一般情况下都用这种方法创建字典,简介
a = {"one":1,"two":2,"three":3}
print(a)

结果:

{'one': 1, 'two': 2, 'three': 3}
  • 用dict创建有值字典1
a = dict({"one":1,"two":2,"three":3})
print(a)

结果:

{'one': 1, 'two': 2, 'three': 3}
  • 用dict创建有值字典2,利用关键字参数
a = dict(one=1,two=2,three=3)
print(a)

结果:

{'one': 1, 'two': 2, 'three': 3}
  • 用dict创建有值字典3
a = dict([(one,1),(two,2),(three,3)])
print(a)

结果:

{'one': 1, 'two': 2, 'three': 3}

3.2 字典特征

  • 字典是无序的,因此没有分片和索引操作

  • 字典中的数据没有都由键值对组成,即kv

    • key:必须是可哈希的值,如int,string,float,tuplle,但是list,set,dict不行

    • value:可以是任何值

3.3 字典常用操作

  • 成员访问
#成员访问,括号内存放的是键值,访问的时候双引号""不能少
a = {"one":1,"two":2,"three":3}
print(a["one"])

#赋值操作
a["one"] = "enis"
print(a)

#删除成员,双引号不能少
del a["one"]
print(a)

结果:

1
{'one': 'enis', 'two': 2, 'three': 3}
{'two': 2, 'three': 3}
  • 成员检测
#成员检测
a = {"one":1,"two":2,"three":3}

if "two" in a :
    print("key")
if "2" in a:
    print("value")
if ("two",2) in a:
    print("kv")

结果:(说明成员检测时检测的是键值)

key

  • 字典遍历,Python2和Python3不同,代码不通用,此处只讲Python3

  • 按键值key遍历

#遍历
a = {"one":1,"two":2,"three":3}
for k in a:
    print(k,d[k])

结果:

one 1
two 2
three 3

#上述代码可以改成以下形式
a = {"one":1,"two":2,"three":3}
for k in a.keys():
    print(k,d[k])

结果:

one 1
two 2
three 3
  • 只访问字典的值
a = {"one":1,"two":2,"three":3}

for v in a.values():
    print(v)
结果:
1
2
3
  • 注意以下特殊用法
a = {"one":1,"two":2,"three":3}

for k,v in a.items():
    print(k,"———",v)

结果:

one ——— 1
two ——— 2
three ——— 3

3.4 字典生成式(字典内涵)

#
a = {"one":1,"two":2,"three":3}

aa = {k:v for k,v in a.items()}
print(aa)

#加限制条件的字典生成式

aaa = {k:v for k,v in a.items() if v % 2 == 0}
print(aaa)

结果:

{'one': 1, 'two': 2, 'three': 3}{'two': 2}

3.5 字典相关函数

  • len,max,min,clear等通用函数不再概述

  • str(字典),返回字典的字符串格式

a = {"one":1,"two":2,"three":3}
print(str(a))

结果:

{'one': 1, 'two': 2, 'three': 3}
  • items,keys,values
a = {"one":1,"two":2,"three":3}

# 返回字典键值对组成的元祖形式
i = a.items()
print(type(i))
print(i)

#返回字典键组成的一个结构
k = a.keys()
print(type(k))
print(k)

#返回字典值组成的一个结构
v = a.values()
print(type(v))
print(v)

结果:

<class 'dict_items'>dict_items([('one', 1), ('two', 2), ('three', 3)])<class 'dict_keys'>dict_keys(['one', 'two', 'three'])<class 'dict_values'>dict_values([1, 2, 3])
  • get,根据制定键值返回相应的值,好处是可以设置默认值
a = {"one": 1, "two": 2, "three": 3}
#此处get默认值是None
print(d.get("one333"))
print(d.get("one"))

#此处将键one333的值设置成100
print(d.get("one333",100))

#此处并没有在字典a中增加one333这个键值对,因而会报错,仔细体会该条代码与上面代码的区别
print(d["one333"])

结果:None1100然后报错
  • fromkeys,使用制定的序列作为键,使所有键的键值都为一个值
a = {"one", "two", "three"}

#此处应注意fromkeys两个参数的类型
#必要要注意fromskeys调用的主体,dict
a = dict.fromkeys(a,"hhhhhhhh")
print(a)

[图片上传中...(image-ece40-1538114686487-0)]

结果:

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

推荐阅读更多精彩内容