day2-字典

概述

在本节,我将介绍字典数据类型,它提供了一种灵活的访问和组织数据的方式。然后结合前面关于列表的知识,你将学习如何创建一个数据结构

字典数据类型

定义:字典的索引被称为"键",键及其关联的值称为"键-值"对。

组成部分:字典输入时带花括号{}

>>> user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}

这个字典的"键"是"name"、"sex"、"age"、"born"

这些键相对应的"值"是:"dick"、"M"、28、"NJ"

可以通过"键"访问这些"值":

>>>user_info["name"]
"dick"
>>>user_info["sex"]
"M"
>>>user_info["age"]
28
 
#字典可以使用任意值作为"键"如:{1212:"Dick"}

字典与列表区别

字典是无序的,列表是有序的,因为无序,所以不能切片key必须是唯一的,所以永久去重

字典中的值和列表一样,是通过方括号访问的

尽管字典是无序的,但是正是使用"键"值"来组织数据,使数据结构化。如:

user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
 
while True:
      info = input("Enter a user info:")
       if info ==" ":
              break
  
       if info in user_info:
            print(user_info[info] + "is the user info of " + info)
      else:
            print("I don't have user info for"+ info)
            print("what is the user info?")
            new_value = input()
            user_info[info] = new_value
            print("user_info has been updated successfully!") 

keys()、values()和items()方法

有3个字典方法,它们将返回类似列表的值,分别对应于字典的"键"、"值"和"键-值"对

1.键:keys(),返回一个列表

>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
>>>k = user_info.keys()
>>>print(k)
dict_keys(['sex', 'born', 'name', 'age'])

2.值:values(),返回一个列表

>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
>>>v = user_info.values()
>>>print(v)
dict_values(['M', 'NJ', 'dick', 28])

3.键-值对:items()

>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
>>>v = user_info.items()
>>>print(i)
dict_items([('name', 'dick'), ('age', 28), ('born', 'NJ'), ('sex', 'M')])
 
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
for x in user_info.items():
    print(x)
#输出
('born', 'NJ')
('name', 'dick')
('age', 28)
('sex', 'M')

 这些方法返回的值不是列表,也不能被修改。但可以用于for循环

user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
for x in user_info.keys():
    print(x)
#输出
sex
name
born
age
  • 通过传入list()方法将它可转换为列表:
>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
>>>list(user_info)
[('name', 'dick'), ('sex', 'M'), ('born', 'NJ'), ('age', 28)]
  •  通过循环进行多重赋值:
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
for x in user_info.items():
    for k,v in x:
        print("i:"+k+ "," + "j:"+str(v))

 利用keys(),values()和items()方法,循环分别可以迭代键、值和键-值对。我们可以看到items()方法返回的dict_items值中,包含的是键和值的元组。

检查字典中是否存在键或值

我们知道in 和not in 操作符可以检查值是否存在于列表中。也可以应用在字典中

>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
>>>"name" in user_info.keys()
True
 
>>>"M" in user_info.values()
True
 
>>>"sex" in user_info "sex" in user_info本质上是一个简写版本。相当于"sex" in user_info.keys()

其他方法

在访问一个键的值之前,检查该键是否存在于字典中,我们知道如果键不在字典中,而我们查询时,会报错,而使用get()方法,可以解决这个问题,下面开始介绍

1.get()

用法:它有两个参数:要取得其值的键,以及如果该键不存在时,返回备用值。

user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
x = "Married(Y/N)" + ":" + user_info.get("status","Y")
print(x)
#输出
Married(Y/N):Y
 
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
x = "Married(Y/N)" + ":" + user_info["status"]
print(x)
#输出
Traceback (most recent call last):
  File "/usercode/file3.py", line 3, in
    x = "Married(Y/N)" + ":" + user_info["status"]
KeyError: 'status
#因为user_info字典中没有"status"键,get()方法返回的默认值是"Y"。不使用get(),代码就会产生一个错误消息

2.setdefault()

方法是一个很好的快捷方式,可以确保一个键存在

用法:为字典中某个键设置一个默认值,当该键没有任何值时使用它

spam = {'name': 'Pooka', 'age': 5}
if 'color' not in spam:
spam['color'] = 'black'  
#传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。
 
 
>>>spam = {'color': 'black', 'age': 5, 'name': 'Pooka'}
>>> spam.setdefault('color', 'white')
'black'  
#当spam.setdefault('color','white')接下来被调用时,该键的值“没有”被改变成'white',因为spam 变量已经有名为'color'的键。

3.修改

user_data = {'huwei':"qawsed123",'admin':"password",'dick':"huwei123"}

user_data["huwei"] = "abc123"  #修改
print(user_data)
#输出
{'huwei':"abc123",'admin':"password",'dick':"huwei123"}

4.添加

user_data = {'huwei':"qawsed123",'admin':"password",'dick':"huwei123"}
user_data["jacky"] = "5566" #增加 print(user_data) #输出 {'huwei':"abc123",'admin':"password",'dick':"huwei123","jacky":"5566"}

5.删除

user_data = {'huwei':"qawsed123",'admin':"password",'dick':"huwei123"}
del user_data["huwei"]   #删除键是“huwei”的条目
print(user_data)
#输出
{'admin':"password",'dick':"huwei123","jacky":"5566"}

user_data = user_data
user_data.pop("jacky")   #删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出
print(user_data)
#输出
{'admin':"password",'dick':"huwei123"}

user_data = {'admin':"password",'dick':"huwei123","jacky":"5566"}
user_data.popitem()    #随机返回并删除字典中的一对键和值
print(user_data)
#输出
{'admin':"password","jacky":"5566"}

user_data = {'admin':"password",'dick':"huwei123","jacky":"5566"}
user_data.clear()    #清空词典所有条目
print(user_data)
#输出
{}

6.len(dict)

用法:计算字典元素个数,即键的总数

dict = {'Name': 'dick', 'Age': 27,'sex':'M'};
print(Length : %d" % len(dict))
#输出
Length : 3

7.copy()

用法:返回一个字典的浅复制

dict1 = {'Name': 'dick', 'Age': 22};

dict2 = dict1.copy()
print("New Dictinary: %s" %str(dict2))
#输出
New Dictinary: {'Age': 22, 'Name': 'dick'}

8.update()

用法:把字典dict2的键/值对更新到dict里

dict = {'Name': 'dick', 'Age': 27}
dict2 = {'Sex': 'male' }

dict.update(dict2)
print(dict)
#输出
{'Age': 27, 'Name': 'dick', 'Sex': 'male'}

#两个字典,有交叉就更新,没有交叉就创建新的

9.fromkeys(seq[,val])

用法:创建一个新字典,以序列seq 中元素做字典的键,val 为字典所有键对应的初始值

c = dict.fromkeys([1,2,3],"well")   #初始化一个新的字典
print(c)
#输出
{1: 'well', 2: 'well', 3: 'well'}

10.update()

用法:把字典dict2的键/值对更新到dict里

8.update()

用法:把字典dict2的键/值对更新到dict里

8.update()

用法:把字典dict2的键/值对更新到dict里

8.update()

用法:把字典dict2的键/值对更新到dict里

 

嵌套的字典

列表和字典,他们都可以包含多个值,包括其他列表和字典

字典:把一些项(键)映射到另一些项(值)

列表:只包含一系列有序的值

他们都是通过方括号[]访问表项的

三级菜单实例

#!/usr/bin/env python
#-*- coding:utf-8 -*-


China = {
    "华北":{
       "北京":{
         "东城区":{"安定门街道",
                  "北新桥街道",
                  "东四街道"},
         "西城区":{"西长安街街道",
                  "广安门外街道",
                  "椿树街道"},
         "朝阳区":{"和平街街道",
                  "将台街道",
                  "左家庄街道"},
     },
    },
    "东北":{
       "黑龙江":{
         "哈尔滨市":{
             "道里区",
             "南岗区",
             "香坊区"},
         "大庆市":{
                "萨尔图区",
                "龙凤区",
                "大同区"}
},
    },
    "华东":{
        "江苏":{
          "南京市":{
            "鼓楼区",
            "建邺区",
            "白下区"},
          "苏州市":{
             "相城区",
             "工业园区",
             "吴中区"}
    }
}
}

while True:
    for f in China:
        print(f)
    choice = input("请选择行政区域或选择按q退出:")
    if choice in China:
       while True:
          for i in China[choice]:
             print(i)
          choice2 = input("请选择省份区域或选择按m返回上一层:")
          if choice2 in China[choice]:
             while True:
               for s in China[choice][choice2]:
                   print(s)
               choice3 = input("请选择市级区域或选择按n返回上一层:")
               if choice3 in China[choice][choice2]:
                  while True:
                   for t in China[choice][choice2][choice3]:
                       print(t)
                   choice4 = input("返回上一层,请按b):")
                   if choice4 == "b":
                       break
               elif choice3 == "n":
                   break
          elif choice2 == "m":
              break
    elif choice == "q":
        break
#输出
华东
东北
华北
请选择行政区域或选择按q退出:华东
江苏
请选择省份区域或选择按m返回上一层:江苏
南京市
苏州市
请选择市级区域或选择按n返回上一层:南京市
鼓楼区
白下区
建邺区
返回上一层,请按b):b
南京市
苏州市
请选择市级区域或选择按n返回上一层:b
南京市
苏州市
请选择市级区域或选择按n返回上一层:n

循环字典

实现方式1

user_data = {'dick': 'huwei123', 'huwei': 'qawsed123', 'admin': 'password'}

for i in user_data:
    print(i,user_data[i])
#输出
huwei qawsed123
admin password
dick huwei123

实现方式2

user_data = {'dick': 'huwei123', 'huwei': 'qawsed123', 'admin': 'password'}

for k,v in user_data.items():  #执行分两步,先从字典转换成列表
    print(k,v)
#输出
huwei qawsed123
admin password
dick huwei123

小结:

1.方式1的效率比方式2的效率高很多
2.方式1是直接通过key取value
3.方式2是先把字典转换成一个列表,再去取值
4.当数据量比较大的时候,用第2种方式时,字典转换成列表的这个过程需要花大量的时间作转换,当然数据量不大,没有关系,效率差不多

 

posted @ 2017-07-27 16:23  Mr.hu  阅读(187)  评论(0编辑  收藏  举报