最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

遍历key和value_python中字典dict的操作技巧汇总

XAMPP案例 admin 1306浏览 0评论

字典是使用最为广泛的数据结构了,从结构来看,其内容就是键值对,键称为key, 值称为value, 类似词典中通过前面的索引来快速查找后面的页面,通过key可以快速定位对应的值。字典,是python中对这种结构的命名,在其他语言中有其他的名字,比如perl中称之为哈希。

字典通过大括号或者dict函数来创建,用法如下

>>> a = {'one':1, 'tow':2, 'three':3}
>>> a
{'one': 1, 'tow': 2, 'three': 3}
>>> type(a)
<class 'dict'>

key和value之间用冒号分隔,多个键值对用逗号分隔。上述字典用dict函数创建的代码如下

>>> a = dict((('one',1), ('tow',2), ('three',3)))
>>> a
{'one': 1, 'tow': 2, 'three': 3}
>>>
>>> a = dict(zip(['one', 'tow', 'three'], [1, 2, 3]))
>>> a
{'one': 1, 'tow': 2, 'three': 3}
>>>
>>>
>>> a = dict({'one':1, 'tow':2, 'three':3})
>>> a
{'one': 1, 'tow': 2, 'three': 3}

可以看到,dict函数更加灵活,支持多种写法。字典中的key是无序且唯一的,不存在数字下标索引,要访问其中的值,只能通过key来访问,用法如下

>>> a = {'one':1, 'tow':2, 'three':3}
>>> a['one']
1

关于字典,内置了很多方法和函数,常用的几种如下

1. 访问字典元素

# 方括号加下标
>>> a = {'one':1, 'tow':2, 'three':3}
>>> a['one']
1
# get方法
>>> a.get('one')
1

2. 修改字典元素

# 可以重新赋值,也可以新增值
>>> a = {'one':1, 'tow':2, 'three':3}
>>> a['one'] = 2
>>> a
{'one': 2, 'tow': 2, 'three': 3}
# del 删除元素
>>> del a['one']
# pop删除元素
>>> a.pop("tow")
# 清空字典
>>> a.clear()

3. 遍历字典

当我们遍历字典的时候,本质是在遍历字典的key和value, 通过以下函数可以方便的获得字典的key或者value

# 返回所有key的列表
>>> a.keys()
dict_keys(['one', 'tow', 'three'])
# 返回所有values的列表
>>> a.values()
dict_values([1, 2, 3])
# 返回(key, value)构成的元组序列
>>> a.items()
dict_items([('one', 1), ('tow', 2), ('three', 3)])
# 返回所有key的列表
>>> list(a)
['one', 'tow', 'three']
# 返回所有key构成的迭代器
>>> iter(a)
<dict_keyiterator object at 0x035A9D20>
>>> for i in iter(a):
...     print(i)
...
one
tow
three

在perl中,哈希的key都是字符串,而在python中,字典的key非常灵活,只要是不可变的对象都可以,比如数字,字符串,元组。利用元组,可以模拟多维字典,用法如下

>>> a = {(1, 2):'one', (3, 4):'tow'}
>>> a[(1,2)]
'one'

上面就是字典的基本用法,掌握了基础,我们来看两个在实际中经常使用的进阶版字典

1. 值为列表的字典

python中不仅key很灵活,其value也很灵活。比如我们想要创建一个value为列表的字典,也是可以的

>>> a = {'one' : [1, 2, 3, 4, 5], 'tow':[1, 2, 3, 4, 5]}
>>> a
{'one': [1, 2, 3, 4, 5], 'tow': [1, 2, 3, 4, 5]}
>>> a['one']
[1, 2, 3, 4, 5]

直接写,当然没什么难度,但是在实际工作中,经典的使用场景是循环给字典赋值,如果要实现值为列表,必须先将值设为一个空的列表,用法如下

>>> num = [1, 2, 3, 4, 5]
>>> a = {}
# 直接添加,报错
>>> for i in num:
...     a['one'].append(i)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyError: 'one'
# 先设定为空列表,在追加
# 结果ok
>>> a['one'] = []
>>> for i in num:
...     a['one'].append(i)
...
>>>
>>> a
{'one': [1, 2, 3, 4, 5]}

可以看出,关键的问题是value的默认值,由于默认值不是列表,所以直接用append方法会报错。为了解决问题,只需要将默认值设为列表就可以了。python有一个内置模块collections, 提供了defaultdict函数,可以方便的设置默认值,用法如下

>>> from  collections import defaultdict
>>> # 这里的list表明key的默认value为list
>>> a = defaultdict(list)
>>> for i in num:
...     a['one'].append(i)
...
>>>
>>> a
defaultdict(<class 'list'>, {'one': [1, 2, 3, 4, 5]})

用这种写法更加优雅。

2. 嵌套的字典

所谓嵌套,就是有多级key, 类似

a[key1][key2] = value

通过设置value的默认值为dict, 可以方便的实现嵌套字典,用法如下

>>> a = defaultdict(dict)
>>> a['one']['tow'] = 1
>>> a['one']['three'] = 2
>>> a
defaultdict(<class 'dict'>, {'one': {'tow': 1, 'three': 2}})

上述写法只支持两个key的嵌套  在实际工作中已经可以满足需求了,两层以上的嵌套几乎用不到。

比如有份体重表,小明:79kg,小红:45kg,张三:60kg,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。

为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:


zzzzzx91
图 1 字典保存的关联数据


由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。
程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就是 Python 中的字典类型。
在使用花括号语法创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开;多个 key-value 对之间用英文逗号隔开。

zzzzzx091

创建一个空的字典

weight0 = dict()

print(weight0) #

{}

使用{}创建字典:

weight={'小明':79,
'小红':45,
'张三':60}

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60}

  需要指出的是,元组可以作为 dict 的 key,但列表不能作为元组的 key。这是由于 dict 要求 key 必须是不可变类型,但列表是可变类型,因此列表不能作为元组的 key。访问也是通过元组进行访问。

# 使用元组作为dictkey
dict2 = {(20, 30):'good', 30:'bad'}

print(dict2)

{(20, 30): ‘good’, 30: ‘bad’}

dict2[(20, 30)]

‘good’

  在使用 dict() 函数创建字典时,可以传入多个列表或元组参数作为 key-value 对,每个列表或元组将被当成一个 key-value 对,因此这些列表或元组都只能包含两个元素。例如如下代码:

dict_values=[('小明',79),('小红',45),('张三',60)]
weight=dict(dict_values)

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60}

通过为 dict 指定关键字参数创建字典,此时字典的 key 不允许使用表达式

dict0 = dict(a = 10, b = 20.9)

print(dict0)

{‘a’: 10, ‘b’: 20.9}

字典的访问

通过 key 访问 value

weight['小明']
7

字典的添加

通过 key 添加 key-value 对

weight['李四']=90

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 90}

字典的删除

通过 key 删除 key-value 对

weight['王五']=130
print(weight)
del weight['王五']

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60, ‘王五’: 130}

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60}

字典修改

通过 key 修改 key-value 对字典的修改

weight['李四']=60

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60}

key的判断

通过 key 判断指定 key-value 对是否存在。

print('王五'  in weight)

print(李四in weight)

False

True

字典常用方法

clear() 

clear() 用于清空字典中所有的 key-value 对,对一个字典执行 clear() 方法之后,该字典就会变成一个空字典。

dict0 = dict(a = 10, b = 20.9)
print(dict0)
dict0.clear()

print(dict0)

{‘a’: 10, ‘b’: 20.9}

{}

get()方法

get() 方法其实就是根据 key 来获取 value,它相当于方括号语法的增强版,当使用方括号语法访问并不存在的 key 时,字典会引发 KeyError 错误;

print(weight.get('张三'))

print(weight.get(阿大))

60

None

update()方法

update() 方法可使用一个字典所包含的 key-value 对来更新己有的字典。在执行 update() 方法时,如果被更新的字典中己包含对应的 key-value 对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的 key-value 对,则该 key-value 对被添加进去。

print(weight)
weight.update({'张三':56,'阿小':40})

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60}

{‘小明’: 79, ‘小红’: 45, ‘张三’: 56, ‘李四’: 60, ‘阿小’: 40}

items()、keys()、values()

items()、keys()、values() 分别用于获取字典中的所有 key-value 对、所有 key、所有 value。

这三个方法依次返回 dict_items、dict_keys 和 dict_values 对象,Python 不希望用户直接操作这几个方法,但可通过 list() 函数把它们转换成列表。

print(weight.items())
print(weight.keys())

print(weight.values())

dict_items([(‘小明’, 79), (‘小红’, 45), (‘张三’, 56), (‘李四’, 60), (‘阿小’, 40)])

dict_keys([‘小明’, ‘小红’, ‘张三’, ‘李四’, ‘阿小’])

dict_values([79, 45, 56, 60, 40])

遍历key和value

方式一,通过items方法

for key,value in weight.items():

print(‘Key:{},value:{}’.format(key,value))

Key:小明,value:79

Key:小红,value:45

Key:张三,value:56

Key:李四,value:60

Key:阿小,value:40

方式二,通过zip方法:

for (key,value) in zip(weight.keys(),weight.values()):

print(‘Key:{},value:{}’.format(key, value))

Key:小明,value:79

Key:小红,value:45

Key:张三,value:56

Key:李四,value:60

Key:阿小,value:40

字典嵌套

score = {
'小明':{
'语文':99,
'数学':99,
'英语':98,
},
'小红': {
'语文': 91,
'数学': 89,
'英语': 78,
},
'小张': {
'语文': 59,
'数学': 90,
'英语': 91,
}
}
score['小明']['数学'] = '100'

print(score)

{‘小明’: {‘语文’: 99, ‘数学’: ‘100’, ‘英语’: 98},

‘小红’: {‘语文’: 91, ‘数学’: 89, ‘英语’: 78},

‘小张’: {‘语文’: 59, ‘数学’: 90, ‘英语’: 91}}

 比如有份体重表,小明:79kg,小红:45kg,张三:60kg,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。

     为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:



                             图 1 字典保存的关联数据


     由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。
   程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就是 Python 中的字典类型。
   在使用花括号语法创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开;多个 key-value 对之间用英文逗号隔开。

创建一个空的字典

weight0 = dict()

print(weight0) #

{}

使用{}创建字典:

weight={'小明':79,
'小红':45,
'张三':60}

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60}

  需要指出的是,元组可以作为 dict 的 key,但列表不能作为元组的 key。这是由于 dict 要求 key 必须是不可变类型,但列表是可变类型,因此列表不能作为元组的 key。访问也是通过元组进行访问。

# 使用元组作为dictkey
dict2 = {(20, 30):'good', 30:'bad'}

print(dict2)

{(20, 30): ‘good’, 30: ‘bad’}

dict2[(20, 30)]

‘good’

  在使用 dict() 函数创建字典时,可以传入多个列表或元组参数作为 key-value 对,每个列表或元组将被当成一个 key-value 对,因此这些列表或元组都只能包含两个元素。例如如下代码:

dict_values=[('小明',79),('小红',45),('张三',60)]
weight=dict(dict_values)

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60}

通过为 dict 指定关键字参数创建字典,此时字典的 key 不允许使用表达式

dict0 = dict(a = 10, b = 20.9)

print(dict0)

{‘a’: 10, ‘b’: 20.9}

字典的访问

通过 key 访问 value

weight['小明']
7

字典的添加

通过 key 添加 key-value 对

weight['李四']=90

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 90}

字典的删除

通过 key 删除 key-value 对

weight['王五']=130
print(weight)
del weight['王五']

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60, ‘王五’: 130}

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60}

字典修改

通过 key 修改 key-value 对字典的修改

weight['李四']=60

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60}

key的判断

通过 key 判断指定 key-value 对是否存在。

print('王五'  in weight)

print(李四in weight)

False

True

字典常用方法

clear() 

clear() 用于清空字典中所有的 key-value 对,对一个字典执行 clear() 方法之后,该字典就会变成一个空字典。

dict0 = dict(a = 10, b = 20.9)
print(dict0)
dict0.clear()

print(dict0)

{‘a’: 10, ‘b’: 20.9}

{}

get()方法

get() 方法其实就是根据 key 来获取 value,它相当于方括号语法的增强版,当使用方括号语法访问并不存在的 key 时,字典会引发 KeyError 错误;

print(weight.get('张三'))

print(weight.get(阿大))

60

None

update()方法

update() 方法可使用一个字典所包含的 key-value 对来更新己有的字典。在执行 update() 方法时,如果被更新的字典中己包含对应的 key-value 对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的 key-value 对,则该 key-value 对被添加进去。

print(weight)
weight.update({'张三':56,'阿小':40})

print(weight)

{‘小明’: 79, ‘小红’: 45, ‘张三’: 60, ‘李四’: 60}

{‘小明’: 79, ‘小红’: 45, ‘张三’: 56, ‘李四’: 60, ‘阿小’: 40}

items()、keys()、values()

items()、keys()、values() 分别用于获取字典中的所有 key-value 对、所有 key、所有 value。

这三个方法依次返回 dict_items、dict_keys 和 dict_values 对象,Python 不希望用户直接操作这几个方法,但可通过 list() 函数把它们转换成列表。

print(weight.items())
print(weight.keys())

print(weight.values())

dict_items([(‘小明’, 79), (‘小红’, 45), (‘张三’, 56), (‘李四’, 60), (‘阿小’, 40)])

dict_keys([‘小明’, ‘小红’, ‘张三’, ‘李四’, ‘阿小’])

dict_values([79, 45, 56, 60, 40])

遍历key和value

方式一,通过items方法

for key,value in weight.items():

print(‘Key:{},value:{}’.format(key,value))

Key:小明,value:79

Key:小红,value:45

Key:张三,value:56

Key:李四,value:60

Key:阿小,value:40

方式二,通过zip方法:

for (key,value) in zip(weight.keys(),weight.values()):

print(‘Key:{},value:{}’.format(key, value))

Key:小明,value:79

Key:小红,value:45

Key:张三,value:56

Key:李四,value:60

Key:阿小,value:40

字典嵌套

score = {
'小明':{
'语文':99,
'数学':99,
'英语':98,
},
'小红': {
'语文': 91,
'数学': 89,
'英语': 78,
},
'小张': {
'语文': 59,
'数学': 90,
'英语': 91,
}
}
score['小明']['数学'] = '100'

print(score)

{‘小明’: {‘语文’: 99, ‘数学’: ‘100’, ‘英语’: 98},

‘小红’: {‘语文’: 91, ‘数学’: 89, ‘英语’: 78},

‘小张’: {‘语文’: 59, ‘数学’: 90, ‘英语’: 91}}

 

转载请注明:XAMPP中文组官网 » 遍历key和value_python中字典dict的操作技巧汇总

您必须 登录 才能发表评论!