python基础5-字典
数据类型
字典
字典定义、创建
字典是一种可变容器类型,且可以存储任意类型对象。字典和列表的最大的区别是字典强调的是“键值对”,key与value一一对应,字典中的存放顺序并不重要,重要的是“键”和“值”的对应关系。在字典中,要求key是唯一的,且不可变的。所以字典的特点如下:
- 查找速度快
- key-value序对没有顺序
- key键不可变且唯一
字典的创建,使用
{}
,每个键值对用
:
隔开,每对之间用
,
分割。还有使用dict和使用fromkeys的方法
>>
>
d1
=
{
'key'
:
'value'
}
# 使用dict()初始化字典,其中键必须是字符串
>>
>
d2
=
dict
(
key
=
'value'
)
# 使用dict创建时,下面的情况会出现bug
>>
>
key
=
'name'
>>
>
d3
=
dict
(
key
=
'value'
)
# 这个代码,原本我们是想输出{'name':'value'},可以结果并不一样,所以使用dict初始化的时候需要注意
>>
>
print
(
d3
)
{
'key'
:
'value'
}
# 使用fromkeys方法初始化字典
#初始化
>>
>
d4
=
{
}
.
fromkeys
(
[
'key1'
,
'key2'
]
)
>>
>
d4
{
'key1'
:
None
,
'key2'
:
None
}
>>
>
d5
=
dict
(
)
.
fromkeys
(
[
'key1'
,
'key2'
]
)
>>
>
d5
{
'key1'
:
None
,
'key2'
:
None
}
# 初始化并赋值
>>
>
d6
=
{
}
.
fromkeys
(
[
'key1'
,
'key2'
]
,
'value'
)
>>
>
d6
{
'key1'
:
'value'
,
'key2'
:
'value'
}
# 也可以先初始化,然后动态地添加
>>
d7
=
{
}
>>
>
d7
[
'key1'
]
=
'value1'
>>
>
d7
[
'key2'
]
=
'value2'
>>
>
d7
{
'key1'
:
'value1'
,
'key2'
:
'value2'
}
# 使用zip函数把键列表和值列表打包成键值对一一对应的元组
>>
>
d8
=
dict
(
zip
(
[
'key1'
,
'key2'
]
,
[
'value1'
,
'value2'
]
)
)
>>
>
d8
{
'key1'
:
'value1'
,
'key2'
:
'value2'
}
# 字典推导表达式
>>
>
d9
=
{
x
:
x
**
2
for
x
in
[
1
,
2
,
3
]
}
>>
>
d9
{
1
:
1
,
2
:
4
,
3
:
9
}
访问、修改字典
字典和列表一样,是一种存储数据的容器;在列表中,可以通过下标索引来访问元素,在字典中通过键来访问它的对应值,即key:value;可以修改,添加等操作。
>>
>
d1
=
{
'type'
:
'dict'
,
'code'
:
'python'
}
# 值访问
>>
>
d1
[
'type'
]
'dict'
# 内容添加
>>
>
d1
[
1
]
=
2
>>
>
d1
{
'type'
:
'dict'
,
'code'
:
'python'
,
1
:
2
}
# 内容修改
>>
>
d1
[
'code'
]
=
'java'
>>
>
d1
{
'type'
:
'dict'
,
'code'
:
'java'
,
1
:
2
}
# 删除元素,还可以是用del删除某个字典的key,或者删除整个字典;使用clear() 清空这个字典
>>
>
d1
=
{
'type'
:
'dict'
,
'code'
:
'python'
,
1
:
2
}
>>
>
d1
.
pop
(
'code'
)
# d1的值为{'type': 'dict', 1: 2}
>>
>
del
d1
[
1
]
# d1的值为{'type': 'dict'}
>>
>
d1
.
clear
(
)
# d1 = {}
>>
>
del
d1
>>
>
print
(
d1
)
# NameError: name 'd1' is not defined
# 如果有两个字典,可以使用update函数来更新其中某一个字典
# 从下面代码的结果上可以看出,如果d1中没有d2的元素,则添加进来;如果有,则修改为d2中的值
>>
>
d2
=
{
1
:
3
,
2
:
4
,
5
:
6
}
>>
>
d1
.
update
(
d2
)
>>
>
d1
{
'type'
:
'dict'
,
1
:
3
,
2
:
4
,
5
:
6
}
字典的遍历
d
=
{
'a'
:
1
,
'b'
:
2
,
'c'
:
3
}
# 遍历key值
for
key
in
d
:
print
(
"{} : {}"
.
format
(
key
,
d
[
key
]
)
)
# 该方法和上面的方法是等价的
for
key
in
d
.
keys
(
)
:
print
(
"{} : {}"
.
format
(
key
,
d
[
key
]
)
)
# 遍历value值
for
value
in
d
.
values
(
)
:
print
(
value
)
# 遍历字典项
for
key_value
in
d
.
items
(
)
:
print
(
key_value
)
# 遍历字典健值
for
key
,
value
in
d
.
items
(
)
:
print
(
"{} : {}"
.
format
(
key
,
value
)
)
字典的排序
字典的排序有两种方法,第一种是 list()函数和字典的keys()方法相结合,对产生的list排序,然后输出。第二种方法是使用内置函数sorted()进行排序,会返回排序好的键。
# 使用list()函数,和keys()相结合
d
=
{
1
:
2
,
7
:
8
,
3
:
4
,
5
:
6
}
d_key
=
list
(
d
.
keys
(
)
)
d_key
.
sort
(
)
for
key
in
d_key
:
print
(
key
,
d
[
key
]
)
# 使用sorted函数
for
key
in
sorted
(
d
)
:
print
(
key
,
d
[
key
]
)
判断键值是否存在
在python2中判断一个字典中某个key是否存在可以使用has_key和in两种方法,但是在python3中只有in方法,
>>
>
d
=
{
'type'
:
'dict'
,
'code'
:
'java'
,
1
:
2
}
>>
>
'code'
in
d
True
>>
>
3
in
d
False
字典中get()方法
有这样一种情况,我们想获取字典中的某一个值,但是有不确定它是否存在,那么如果直接写
dict[key]
肯定是不妥当的,那么只能是先判读,然后在输出。这样写是可以的,但是在python中提供了一种方法
get(key, default=None)
,即若果存在直接输出结果,如果不存在,则输出为default的值。
# 获取字典中的值
d
=
{
'code'
:
'python'
}
if
'name'
in
d
:
print
(
d
[
'name'
]
)
else
:
print
(
'default'
)
# get()替代 if ... else ...
print
(
d
.
get
(
'name'
,
'default'
)
)
字典和列表的不同
- 从创建方式上,列表使用的是方括号,字典使用的是花括号。
- 字典里的对象是无序的,通过key-value来表示一种映射关系;列表中的元素是有序的,可以通过序号直接获取元素,或者通过切片操作获取多个元素。
- 相对而言,字典更耗费空间,因为需要维护key。
- list随着数量的正常增长要想查找元素的时间复杂度为O(n), dict不随数量而增长而变化,时间负责都为O(1)