数据类型之字典

字典(dict)是一个kv即键值存储库,是python中唯一的映射类型,官方叫做 Mapping Type。

字典是可变数据类型,即可以对元素重新赋值。字典不是序列,它是无序的。

字典通过key获取元素值,而不是索引编号。在访问或删除key时,如果key不存在,会抛出 KeyError 异常。

字典用花括号{}表示,元素是k:v键值对,用逗号隔开。键必须是不可变类型,比如数字、字符串和元组,元祖中的元素也必须是不可变类型。

语法格式

dict(**kwarg)
dict(mapping, **kwarg)
dict(iterable, **kwarg)

创建一个字典

a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
print(a == b == c == d == e)
# True

这几种都表示同一个字典:{"one": 1, "two": 2, "three": 3}

删除字典中的元素用del:del d['key']或者del(d['key'])

clear:清空字典中的元素。

>>> help(d.clear)
Help on built-in function clear:

clear(...) method of builtins.dict instance
    D.clear() -> None.  Remove all items from D.

copy:复制一个字典。返回原字典的浅拷贝。

>>> help(d.copy)
Help on built-in function copy:

copy(...) method of builtins.dict instance
    D.copy() -> a shallow copy of D

get:获取元素值。这里可以定义一个默认值,如果key存在则返回元素值,如果不存在,则返回默认值,默认值如果没有指定,则默认为None。

>>> help(d.get)
Help on built-in function get:

get(...) method of builtins.dict instance
    D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
user={'name': 'keith', 'age': 18, 'tel': 110}
user.get('name')
# 'keith'

user.get('addr','beijing')
# 'beijing'

setdefault:字面意思是设置默认值,与get类似,也可以用来获取元素值,不同的是,它可以为元素赋值。如果key存在,则返回元素值;如果key不存在,则新建一个元素。如果未设置默认值,则默认为None。

>>> help(d.setdefault)
Help on built-in function setdefault:

setdefault(...) method of builtins.dict instance
    D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
user = {'name': 'keith', 'age': 18, 'tel': 110, 'addr': 'wuhan'}
user.setdefault('sex', 1)
print(user)
# {'name': 'keith', 'age': 18, 'tel': 110, 'addr': 'wuhan', 'sex': 1}

fromkeys:根据给定的序列创建一个新的字典,如果没有指定value,则value默认为None。

>>> help(d.fromkeys)
Help on built-in function fromkeys:

fromkeys(iterable, value=None, /) method of builtins.type instance
    Returns a new dict with keys from iterable and values equal to value.
dict.fromkeys(['name','age','tel'])
# {'name': None, 'age': None, 'tel': None}
dict.fromkeys(['name','age','tel'],'xx')
# {'name': 'xx', 'age': 'xx', 'tel': 'xx'}

keys:返回所有key,这里返回的是一个dictionary view对象,由于keys都是唯一的而且是可hash的,所以这里是一个类set对象,支持set的操作。

>>> help(d.keys)
Help on built-in function keys:

keys(...) method of builtins.dict instance
    D.keys() -> a set-like object providing a view on D's keys
user={'name': 'keith', 'age': 18, 'tel': 110}
user.keys()
# dict_keys(['name', 'age', 'tel'])
list(user.keys())
# ['name', 'age', 'tel']

values:返回所有value,这里返回的也是一个dictionary view对象。

>>> help(d.values)
Help on built-in function values:

values(...) method of builtins.dict instance
    D.values() -> an object providing a view on D's values
user = {'name': 'keith', 'age': 18, 'tel': 110}
user.values()
# dict_values(['keith', 18, 110])
list(user.values())
# ['keith', 18, 110]

items:这里返回的也是一个dictionary view对象。将字典中的元素的kv转换为元祖列表。如果keys和values都是可hash的,那么items view将也是一个类set对象。

>>> help(d.items)
Help on built-in function items:

items(...) method of builtins.dict instance
    D.items() -> a set-like object providing a view on D's items
user = {'name': 'keith', 'age': 18, 'tel': 110}
>>> user.items()
dict_items([('name', 'keith'), ('age', 18), ('tel', 110)])
>>> type(user.items())
<class 'dict_items'>
>>> list(user.items())
[('name', 'keith'), ('age', 18), ('tel', 110)]

遍历字典

user = {'name': 'keith', 'age': 18, 'tel': 110}
for i in user.items():
    print(i)

# ('name', 'keith')
# ('age', 18)
# ('tel', 110)

这样就可以同时获取元素的key和value了,不过这里返回的是元祖,你可能想要用冒号分开的格式,解包一下就可以。

user = {'name': 'keith', 'age': 18, 'tel': 110}
for k, v in user.items():
    print(k, ':', v)

# name : keith
# age : 18
# tel : 110

update:用来更新数据。

>>> help(dict.update)
Help on method_descriptor:
update(...)
    D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
    If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
    If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
    In either case, this is followed by: for k in F:  D[k] = F[k]
user = {'name': 'keith', 'age': 18, 'tel': 110}
user.update({'age': 30, 'addr': 'shanxi'})
print(user)
# {'name': 'keith', 'age': 30, 'addr': 'shanxi'}

pop:用来删除元素,删除指定key对应的元素,并返回value,注意,返回的是value,而不是整个元素。这里也可以给一个默认值,如果key不存在,则返回默认值,如果没有给定默认值,则会抛出KeyError异常。默认值只有在key不存在时才会被返回,如果key存在,就只会返回key本身的value。

>>> help(dict.pop)
Help on method_descriptor:
pop(...)
    D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
    If key is not found, d is returned if given, otherwise KeyError is raised
user = {'name': 'keith', 'age': 18, 'tel': 110}
print(user.pop('tel'))
# 110
print(user)
# {'name': 'keith', 'age': 18}

另外,pop必须跟至少一个参数,不然会抛出TypeError异常。

popitem:也是用来删除元素,不过这里会同时返回kv组成的元祖。这里不带参数,直到字典被清空。如果字典为空,则会抛出KeyError异常。

>>> help(dict.popitem)
Help on method_descriptor:
popitem(...)
    D.popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple; but raise KeyError if D is empty.
user = {'name': 'keith', 'age': 18, 'tel': 110}
user.popitem()
# ('tel', 110)

从python3.6开始,字典默认就是有序的了,叫做Ordereddict,所以使用popitem每次删除的总是最后一个元素。

参考文档

posted @ 2017-10-06 02:24  KeithTt  阅读(543)  评论(0编辑  收藏  举报