第四章 数据类型—字典(dict)、集合(set)

字典

  • dict 用{ } 来表示 键值对数据 {key:value} 具有唯一性

  • 键 key: 都必须是哈希的, 不可变的数据类型才可以做字典中的键

  • 值 value: 没有任何的限制,任何数据类型都可以

  • 字典本身是无序的(不可以切片),但是3.6版本添加了有序

#字典的键key可以是什么,  值value(任何类型都可以)
dic={"name":"alex","age":9000}  # 键可为字符串
print(dic)
dic={1:"a",2:"b",3:"c"}     # 键可为数字
print(dic)
dic={True:"1",False:"0"}    # 键可为bool
print(dic)
dic={(1,2,3):"ahd"}    # 键可为tuple 元组
print(dic)

dic={[1,2,3]:"abhd"}   # 键不可为列表  ****  集合也不可用做键
print(dic)

字典的增删改查

补充:dic[key]=value 索引键key可用来 添加\删除\修改\查看

一、增加

  • dic[key]=value # 直接索引 键key 赋value值 更改

  • dic.setdefault(key,value) # 如果key在字典中存在,不进行操作,否则添加

                                      # 也可以通过key查询,没有则返回None

dic = {"易大师": "剑圣", "剑豪": "托儿所", "草丛伦": "大宝剑"}
dic[
"诺手"] = "人头狗" # 新增 结尾处 如果key在字典中存在,就修改value值,不存在就在结尾处添加 print(dic)
dic.setdefault(
"火女", "安妮") # 新增 结尾处 中间用逗号隔开 dic.setdefault("火女", "火男") # 如果key在字典中存在不进行任何操作,不存在就进行添加 print(dic)

二、删除

  • dic.pop(key) # 通过指定key删除字典中的内容,可返回被删除的Value值

  • del dic[key] # 通过键来删除 不放key 则删除整个字典

  • dic.clear( ) # 清空字典

  • dic.popitem( ) # 随机删除, 在3.6版本中默认删除最后一个

                          # 也有返回值 返回的是元组 ( key,value )

  • 字典的删除没有 remove( )

dic={"易大师":"剑圣","剑豪":"托儿所","草丛伦":"大宝剑"}
 ​
 ret=dic.pop("易大师")  # 通过指定key删除字典中内容,返回的是value值
 print(ret)  # 接收到的删除的内容是value
 print(dic)
 ​
 del dic["易大师"]  # 通过键删除
 print(dic)
 ​
 dic.clear()  # 清空返回的是{} 空字典
 print(dic)
 ​
 ref=dic.popitem()   # 随机删除   但在3.6版本中默认删除最后一个
                           # 也有返回值 返回的是元组  ("key","value")
 print(dic)

三、修改

  • dic[key]=value # 索引 键key 既可以用来修改也可以用来添加

  • dic.update(字典名) # 用新的字典去更新原字典

                                      替换时,若key值在原字典中存在,只修改value值,

                                     不存在,在结尾处添加

 dic={"易大师":"剑圣","剑豪":"托儿所","草丛伦":"大宝剑"}
 ​
 dic["剑豪"]="哈莎阁"  #   索引键key  来强制修改
 print(dic)
 ​
 dic1={"火女":"安妮","火男":"布兰德","剑豪":"暗影猎手"}
 dic.update(dic1)  #替换时,若key值在元字典中存在,则只修改value值,不存在的在结尾处添加
 print(dic)
 #输出:{'易大师': '剑圣', '剑豪': '暗影猎手', '草丛伦': '大宝剑', '火女': '安妮', '火男': '布兰德'}

四、查

  • dic[key]  # 索引键key查看 不存在时会报错

  • dic.get(key)  # 查看时key不存在会返回None

  • dic.get(key,"自定义内容") # 查看时key不存在可返回自定义内容

  • dic.setdefault(key) # 即可查询,当有Value时,也可用于添加,key存在,无操作

  • for 循环 # 当 for i in dic 时,获取的是key

 dic = {"易大师": "剑圣", "剑豪": "托儿所", "草丛伦": "大宝剑"}
 ​
 # 查看的是value值
 print(dic["易大师"])  # 查看1   键不存在时 会报错
 print(dic.get("易大师"))  # 查看2   键不存在时 返回none  建议使用get
 print(dic.get("易大师父", "你傻啊,没有"))  # 不存在 也可返回自定义的"你傻啊,没有"
 print(dic.setdefault("易大师"))  # 查看3  也可用于查询  若赋值则可修改
# for循环查看的是key
 for i in dic:
     print(i)  # 循环默认获取的是字典中的键

字典的其他操作

  • keys

  • values

  • items
 dic={"易大师":"剑圣","剑豪":"托儿所","草丛伦":"大宝剑"}
 ​
 print(dic.keys())      # 获取的是高仿列表
 #输出:dict_keys(['易大师', '剑豪', '草丛伦'])
print(dic.values())     # 获取的是高仿列表
 #输出:dict_values(['剑圣', '托儿所', '大宝剑'])
print(dic.items())     #高仿列表  获取的是每一个元组
 #输出:dict_items([('易大师', '剑圣'), ('剑豪', '托儿所'), ('草丛伦', '大宝剑')])
for i in dic:
     print(i)   #输出key
 for i in dic.keys():
     print(i)   #输出key
 for i in dic.values():
     print(i)   #输出value
 for i in dic.items():
     print(i)   #输出键值对,以元组( )的形式展现

items()和iteritems()区别:

一、两个函数的作用 字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。 字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。

二、用例子说明问题

(1)items()操作方法

x = {'nan_ren': 'jiu_mo', "man": 'wbw'}
a = x.items()

print(x) # {'nan_ren': 'jiu_mo', 'man': 'wbw'}
print(type(x)) # <class 'dict'>

print(a) #  # dict_items([('nan_ren', 'jiu_mo'), ('man', 'wbw')])
print(type(a)) # <class 'dict_items'>

(2)iteritems()操作方法

iteritems()方法在需要迭代结果的时候使用最适合,而且它的工作效率非常的高。

总结:

(1)在Python2.x中,iteritems() 用于返回本身字典列表操作后的迭代器【Returns an iterator on all items(key/value pairs) 】,不占用额外的内存。

(2)在Python 3.x 里面,iteritems()方法已经废除了。在3.x里用 items()替换iteritems() ,可以用于 for 来循环遍历。

解构(解包): 

  • 将后面的解构打开,按照位置赋值给变量,

  • 支持字符串\列表\元组

 a,b=(1,2)  #元组
 print(a)   # 1
 print(b)   # 2
 ​
 a,b=[1,2]  #列表
 print(a)  # 1
 print(b)  # 2
 ​
 a,b="12"  #字符串
 print(a)  # 1
 print(b)  # 2
 ​
 dic={"1":"2"}
 for a,b in dic.items():
     print(a)    #1
     print(b)    #2

补充:

  • 批量创建key dic.formkeys()

 dic1={}
 ​
 dics=dic1.fromkeys([1,2,3])   #批量创建 key
 print(dics)
 #输出:{1: None, 2: None, 3: None}
 ​
 dics=dic1.fromkeys([1,2,3],"abc")
 print(dics)
 #输出:{1: 'abc', 2: 'abc', 3: 'abc'}

字典的嵌套

dic={"name":"jiumo",
     "age":18,
     "wife":{"name":"wbw",
             "age":18,
             "salary":100000
     },
     "baby":[
         {"name":"熊大","age":18},
         {"name":"熊二","age":15}
     ]
}
print(dic["baby"][0]["age"])    # 查找熊大的年龄
print(dic.get("baby")[0].get("age"))   # 查找熊大的年龄
 ​
dic["baby"][0]["age"]=19  # 将熊大的年龄改为1

集合

特点

  1. 元素是可哈希的即不可变的
  2. 无序的
  3. 不可重复的, 可以用于去重(重复的内容不打印)
  4. (存储的是字典里的key,不存储value)
  5. 集合本身是可变的数据类型, 不可哈希, 有增删改查的操作
  6. frozenset( )可以冻结集合,使集合 不可变, 可哈希
s={'aa','hufh','koi'}  # set集合
s1={'aa','hufh','koi',('1',2)} # 可含有tuple
s2={'aa','hufh','koi',['1',2]}  # 错误的 含有list不可哈希 

去重

lst = [11,5,4,1,2,5,4,1,25,2,1,4,5,5]
s = set(lst)    # 把列表转换成集合. 进行去重复
lst = list(s)   # 把集合转换回列表.
print(lst)

冻结

s=frozenset(['hh','ji','de'])
dic={s:'123'}  # 集合s冻结后不可变,可以做字典的key
print(dic)
# {frozenset({'de', 'hh', 'ji'}): '123'}

 

posted @ 2018-08-01 21:50  久末丶  阅读(328)  评论(0编辑  收藏  举报