第六章 字典(创建、基本使用)

 
       目前已经学习了列表(可读可写)和元组(只读)这两种数据结构,现在来学习一种特殊的数据结构也称为映射。字典中的值并没有特殊的顺序,但都存储在一个特定的键下,可以通过这个键找到对应的值。键可以是数字、字符串或者元组。

6.1 为什么要引入字典

       使用字典的查询速度与字典中的数据量无关。因此,字典非常适合根据特定的词语(键),查找与其对应的海量信息的应用。

6.2 创建和使用字典

       一个字典是用一对大括号来创建的,键与值之间使用冒号分隔,每一个键值之间用逗号分隔。如果一个大括号中没有任何值,就是一个空的字典。在字典中键是唯一的,这样才能通过键唯一定位某一个值。当然,如果键不唯一,那么程序也不会抛出异常,只是相同的键值,会被覆盖。

var = {“hello”,”world”,12:123456,(1,2,3):”www”}

6.2.1 dict函数

       可以使用dict函数,通过其他映射(如其他的字典)或键值对的序列建立字典。

items = [[“bill”,1234],[“make”,1234]]
d = dict(items)
print(d)

运行结果:{“bill”:1234,”make”:1234}

       可以看出,为dict函数传入一个列表类型的参数,列表的每一个元素是一个列表,或者是一个元组。每一个元素值包含两个值。第1个值表示键,第2个值表示值。

       dict函数还可以通过关键字参数来创建字典。

items = dict(name =”bill”,number =1234,age =34)
print(items)

       dict函数如果不指定任何参数,那么该函数会返回一个空的字典。

items = dict()
print(items)

       示例

# 定义一个空的列表
items = []
while True:
    #从控制台输入一个键和值,当key值为"end"时退出循环
    key = input("请输入Key:")
    if key == "end":
        break;
    value = input("请输入value:")
    keyValue = [key, value]
	#添加列表元素(列表的元素为列表)
    items.append(keyValue)
#将复合列表转化为字典
d = dict(items)
print(d)

6.2.2 字典的基本操作

       字典与列表的相同之处

  • len(dict):返回字典元素(键值对)的个数。
  • dict[key]: 关联得到key的值,类比到列表,key就是索引。
  • dict[key] = value: 将值value关联到键上。
  • del dict[key]: 删除键为key的项。
  • key in dict: 检查dict中是否包含有键为key的项。

       字典与列表的重要区别

  • 键类型:字典的key可以是任意不可变类型,如浮点数、元组、字符串等,而列表的key即索引只能是整数类型。
  • 自动添加:字典可以通过键值自动添加新的项。例如,dict[key] = value 如果key在字典中不存在,那么就在dict中添加一个新的元素。而在列表中必须使用append方法或者insert方法才能添加新的元素。
  • 查找成员:在字典中key in dict查找的是key,而不是value。在列表中使用key in dict操作查找的是值,而不是索引。尽管字典和列表引用时都用dict[key],但key in dict的含义是不同的。

注意:由于字典的数据结构特点,所以在字典中查找key要比在字典中查找值更高效,数据量越大,这种效果越明显。

# 字典中的键可以是任意不可变的类型,自动添加字典元素
dict = {}
dict[20] = "Bill"   
dict["Mike"] = {'age':30,'salary':3000}
dict[(12, "Mike", True)] = "hello"
print(dict)

#列表不能自动添加,索引30的元素不存在
#list = []
#list[30] = "hello"   # 抛出异常

#  演示key in dict操作
IDEs = {
    'eclipse':
        {
        'languages':['Java', 'Python', 'JavaScript','PHP'],
        'organization':'Eclipse基金会'
        },
    'visualstudio':
        {
        'languages':['C#','C++', 'VB.NET'],
        'organization':'微软'
        },
    'webstorm':
        {
        'languages':['JavaScript'],
        'organization':'JetBrains'
        }
    
    }

labels = {
    'languages':'支持的编程语言',
    'organization':'所属机构'
    }

# 控制台输入,并格式化
IDE = input('请输入IDE的名字:')
findIDE = IDE.replace(" ", "").lower()
choice = input('要查询IDE支持的编程语言(lang)还是所属组织机构(org)?')

# 对录入的数据进行相关关联
if choice == "lang": key = 'languages'
if choice == "org": key = 'organization'

# 格式化输出
if findIDE in IDEs:
    print("{}{}是{}.".format(IDE, labels[key], IDEs[findIDE][key]))

6.2.3 字典的格式化字符串

       用字符串模板与元组通过%进行格式化,这种方式在Python2.x中仍然可行。不过在Python3.x中改用了字符串的format_map方法,格式化参数需要用一对{}括起来。

# 使用字符串模板与元组通过%进行格式化
values1 = (1,3,"hello")
str1 = "abc %d,  xyz %d,  %s world" 
print(str1 % values1)

# 定义一个格式化参数字典
values2 = {'title':'极客起源', 'url':'https://geekori.com', 'company':'欧瑞科技'}
# 定义一个字符串模板
str2 = """
<html>
    <head>
        <title>{title}</title>
        <meta charset="utf-8" /> 
    <head>
    <body>
        <h1>{title}</h1>
        <a href="{url}">{company}</a>
    </body>
</html>
"""
# 使用format_map方法格式化字符串
print(str2.format_map(values2))

       使用字典格式化参数值的好处是不需要按照字符串模板中的顺序指定格式化参数值。而且同一个格式化参数可以放在多个位置,在格式化时会替换所有同名的格式化参数。(如果格式化模板中的格式化参数名在字典中未找到,系统会抛出异常)

6.2.4 序列与迭代

  1. 获取字典中key的列表。如果想要知道字典中有哪些key,可以直接使用for语句对字典进行遍历。
dict = {‘x’:1,’y’:2,’z’:3}
for key in dict:
	print(key,end=’ ‘)

运行结果:x y z
  1. 同时获取字典中的key和value列表。除了使用dict[key]获取值外,还可以使用字典中的items方法同时获取key和value。
dict = {‘x’:1,’y’:2,’z’:3}
for key,value in dict.items():
	print(key,value,end=’ ‘)

运行结果:x 1 y 2 z 3
  1. 并行迭代。如果同时想要迭代两个或多个序列,可以使用range函数获取序列索引的范围,然后使用for语句进行迭代。对多个序列进行迭代,一般要求序列中元素个数相同。
names = [“Bill”,”Mary”,”John”]
ages = [30,40,20]
for i in range(len(names)):
	print(names[i],ages[i],end=’ ‘)

运行结果:Bill 30 Mary 40 John 20
  1. 压缩序列。使用zip函数将两个或多个序列的对应元素作为一个元组放到一起,当做新序列的新元素,进行压缩的两个或多个序列的元素个数如果不同,以元素个数最少的为准。
companies = [“百度”,“谷歌”,“360]
websites = [“http://www.baidu.com”,”htttp://www.google.com”]
for value in zip(companies,websites):
	print(value,end=” “)

运行结果:(“百度”,“http://www.baidu.com”)(“谷歌”,”htttp://www.google.com”)
  1. 反转序列迭代。通过reversed函数可以将一个序列反转。
companies = reversed([“百度”,“google”,360])
for value in companies:
	print(value,end=” “)

       示例:

dict = {"name":"Bill", "age":34, "sex":"男", "salary":"3456"}

# 遍历key
for key in dict:

    print(key, "=", dict[key], end = " ")
print()

# 遍历key和value
for key,value in dict.items():
    print(key, "=", value, end = " ")
print();

# 并行迭代
list1 = [1,2,3,4,5]
list2 = ["a", "b", "c", "d", "e"]
for i  in range(len(list1)):
    print("list1[" + str(i) + "]", "=", list1[i], "list2[" +str(i) + "]" ,"=", list2[i],end=" ")
print();

# 压缩迭代
for value in zip(list1, list2):
     print(value, end = " ")
print()
list3 = ['x', 'y']
for value in zip(list2, list3):
    print(value, end = " ")
    
# 反转排序迭代
# sorted对数值从小到大排序,reversed对序列进行反转
print()
values1 = [4,1,3,6,5,2,8]
print(sorted(values1))
values2 = reversed(values1)
for v in values2:
    print(v, end=" ")
print()

# 对单个字符反转,list形成序列,join无符号拼接
print(''.join(list(reversed("hello world"))))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值