python字典

字典介绍


python内置字典:dict,在其他语言中也称map;

使用键值存储,具有极快的查找速度;

键值对作为元素,字典中可以包含多个键值对,键和值的类型不做限制;

键不能重复,如果相同则会覆盖,值可以重复;

字典是无序的,因此不能通过下标的方式来操作;

In [1]: stus={"name":"zyj","score":100}  #创建一个字典

In [2]: stus
Out[2]: {'name': 'zyj', 'score': 100}

In [10]: stus["name"]="sl"  #键不能重复,相当与修改之前键对应的值

In [11]: stus
Out[11]: {'name': 'sl', 'score': 100}

In [3]: stus[1]  #不支持下标的方式查找
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-3-9b18ab9e3e1b> in <module>()
----> 1 stus[1]

KeyError: 1

In [4]: stus["name"] #根据键去查找对应的值
Out[4]: 'zyj'

In [5]: stus["sex"]  #查找的键不存在时会报错
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-5-92cfcdd3fb2f> in <module>()
----> 1 stus["sex"]

KeyError: 'sex'

In [6]: stus.get("name") #可以使用get方法查找键对应的值
Out[6]: 'zyj'

In [7]: stus.get("address") #get方法查找不存在的键时不会报错,返回None

In [8]: 

In [8]: address=stus.get("address")

In [9]: 

In [9]: type(address)  
Out[9]: NoneType  #返回的类型

In [10]:

常用操作:增删改查

In [12]: stus
Out[12]: {'name': 'sl', 'score': 100}

In [13]: stus["sex"]="gril"  #键不存时就是增加

In [14]: stus
Out[14]: {'name': 'sl', 'score': 100, 'sex': 'gril'}

In [15]: stus["sex"]="boy" #键存在时就是修改键对应的值

In [16]: stus
Out[16]: {'name': 'sl', 'score': 100, 'sex': 'boy'}

In [18]: "name" in stus  #判断键是否在字典中存在,而不是判断值
Out[18]: True

In [19]: "sl" in stus
Out[19]: False

In [20]: stus["name"]  #如果有返回,则说明存在
Out[20]: 'sl'

In [21]: stus["add"] #如果返回报错,说明不存在
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-21-ced6c0266c9b> in <module>()
----> 1 stus["add"]

KeyError: 'add'

In [22]: del stus["sex"]  #删除其中的一个键值对

In [23]: stus
Out[23]: {'name': 'sl', 'score': 100}

In [24]: del stus  #直接删除字典 也可以用clear清空字典,但是它不会回收内存

In [25]: stus
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-25-44d38c6a3442> in <module>()
----> 1 stus

NameError: name 'stus' is not defined

字典中常见的函数

In [1]: names={"name":"zyj","age":18,"sex":"gril"}

In [2]: len(names)  #返回字典的长度
Out[2]: 3

In [6]: names.keys() #获取每个元素的键,作为列表输出
Out[6]: dict_keys(['name', 'age', 'sex'])


In [7]: names.values() #获取每个元素的值,
Out[7]: dict_values(['zyj', 18, 'gril'])

In [9]: for i in names.keys():
   ...:     print(i)
   ...:     
name
age
sex

In [10]: for i in names.values():
    ...:     print(i)
    ...:     
zyj
18
gril

In [11]: for item in names.items(): #获取所有的元素,返回的是元组。
    ...:     print(item)
    ...:     
('name', 'zyj')
('age', 18)
('sex', 'gril')

#字典的迭代输出。
In [12]: for item in names.items():
    ...:     print("key:%s,value:%s"%item) #字典的格式化输出,item本身就是元组,以前两个占位符的时候编写为%(a,b)也是元组。
    ...:     
key:name,value:zyj
key:age,value:18
key:sex,value:gril

In [15]: names
Out[15]: {'name': 'zyj', 'age': 18, 'sex': 'gril'}

In [16]: key="sex"

In [19]: if names.has_key(key): #python3中不支持了,使用的比较少,一般使用in,has_key()返回布尔值,因此可以在if语句中作为条件使用

...: print("%在字典中"%key)
...: 
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-19-d7d5c595d57c> in <module>()
----> 1 if names.has_key(key):
2 print("%在字典中"%key)
3

AttributeError: 'dict' object has no attribute 'has_key'



In [17]: if key in names:
...: print("%s在字典中"%key)
...: 
sex在字典中

集合迭代输出补充:内置函数enumerate枚举,

第一种:

  1 names=["zyj","sl","zs","ls"]
  2 names2=("zyj","sl","zs","ls")
  3 j=0
  4 print("number	name")
  5 for i in names:
  6     j+=1
  7     print("%d	%s"%(j,i))
[root@localhost python]# python3 22.py 
number  name
1       zyj
2       sl
3       zs
4       ls

第二种:

  9 for i,item in enumerate(names):
 10     print("%d	%s"%(i,item))
[root@localhost python]# python3 22.py 0 zyj
1 sl 2 zs 3 ls

 序号从1开始:

  9 for i,item in enumerate(names,1):  #enumerate枚举,内置函数。
 10     print("%d	%s"%(i,item))
[root@localhost python]# python3 22.py 
1       zyj
2       sl
3       zs
4       ls
[root@localhost python]# 

案例:学生管理案例升级版

print("="*50)
print("学生名字管理系统".center(50))
print("输出1:添加学生")
print("输出2:查找学生")
print("输出3:修改学生")
print("输出4:删除学生")
print("输出5:查看所有学生")
print("输出6:退出")
#一个学生包含多个信息,一个学生一个字典,学生列表用列表来存储
stus=[]
while True:
    operate=input("请输入你想要的操作:")
    if operate=="1":
        name=input("请输入学生姓名:")
        age=int(input("请输入学生年龄:"))
        qq=input("请输入学生qq:")

        #一个学生包含三个信息,三个信息保存在一个字典中
        stu={}#申请一个字典变量
        stu["name"]=name #往字典变量中添加一个元素
        stu["age"]=age #往字典变量中添加一个元素
        stu["qq"]=qq #往字典变量中添加一个元素

        stus.append(stu)#stus自动会追加改变
        print(stus)

    if operate=="2":
        name=input("请输入要查找的学生姓名:")
        for item in stus:
                if item["name"]==name.strip():#判断字典中包含该学生的姓名
                    print("%s 学生存在,年龄为:%s,QQ为:%s"%(item["name"],item["age"],item["qq"]))
                    break#找到后则整个循环终止,不会执行后面的else,全部循环执行完没有找到,才会执行else打印学生不存在
        else:#else与for对齐,因为要找到所有字典才能算找完,而不能与if对其,因为if执行一次只查找了一个字典,不能说明问题。
            print("学生%s没有找到"%name)
    if operate=="3":
       name=input("请输入你要修改的学生姓名:")
       for item in stus:
            if item["name"]==name.strip():
                item["name"]=input("请输入修改后的姓名:")
          item["age"]=int(input("请输入修改后的年龄"))
          item["qq"]=input("请输入修改后的qq号:")
          print("已经修改完成")
          break
   else:
       print("你要修改的学生%s不存在"%name)
  if operate=="4":
     name=input("请输入要删除的学生姓名:")
     for item in stus:
       if item["name"]==name.strip():
         stus.remove(item) 
         print("学生%s已经删除"%name)
         break 
    else: 
       print("学生%s没有找到"%name)
    if operate=="5":
        print("序号	姓名	年龄	QQ号")
        for i,item in enumerate(stus,1):
            print("%d	%s	%s	%s"%(i,item["name"],item["age"],item["qq"]))
    if operate=="6":
        break


==================================================
学生名字管理系统 
输出1:添加学生
输出2:查找学生
输出3:修改学生
输出4:删除学生
输出5:查看所有学生
输出6:退出
请输入你想要的操作:1
请输入学生姓名:zyj
请输入学生年龄:18
请输入学生qq:123333333
请输入你想要的操作:1
请输入学生姓名:sl
请输入学生年龄:19

请输入学生qq:232323232
请输入你想要的操作:5
序号 姓名 年龄 QQ号
1 zyj 18 123333333
2 sl 19 232323232
请输入你想要的操作:2
请输入要查找的学生姓名:sl
sl 学生存在,年龄为:19,QQ为:232323232
请输入你想要的操作:2 
请输入要查找的学生姓名:ee
学生ee没有找到
请输入你想要的操作:3
请输入你要修改的学生姓名:dd
你要修改的学生dd不存在
请输入你想要的操作:3
请输入你要修改的学生姓名:zyj
请输入修改后的姓名:zhaoyujiao
请输入修改后的年龄18
请输入修改后的qq号:11212121212
已经修改完成
请输入你想要的操作:5
序号 姓名 年龄 QQ号
1 zhaoyujiao 18 11212121212
2 sl 19 232323232
请输入你想要的操作:4
请输入要删除的学生姓名:zh
学生zh没有找到
请输入你想要的操作:4 
请输入要删除的学生姓名:zhaoyujiao
学生zhaoyujiao已经删除
请输入你想要的操作:5
序号 姓名 年龄 QQ号
1 sl 19 232323232
请输入你想要的操作:6
[root@localhost python]#                                           
原文地址:https://www.cnblogs.com/zhaoyujiao/p/9016303.html