Python3 字典 values() 方法
描述
Python 字典的 values() 方法用于获取字典中的所有值,返回一个 dict_values 视图对象。
视图对象不是列表,而是一个与原字典保持关联的动态视图。当字典中的值发生变化,或者添加、删除键值对时,视图会反映这些变化。
例如:
dict_values(['Runoob', 7])
values() 返回的视图具有以下特点:
- 支持遍历:可以使用
for循环访问字典中的所有值。 - 动态更新:原字典发生变化时,视图会反映最新内容。
- 允许重复:不同的键可以对应相同的值。
- 不支持索引:不能直接使用
dict.values()[0]获取第一个值。 - 保留顺序:Python 3.7 及以上版本按照字典键的插入顺序遍历对应的值。
与 dict.keys() 和 dict.items() 一样,values() 返回的是字典视图对象。
如果需要将视图转换为列表,可以使用 list() 函数。
语法
values() 方法语法如下:
dict.values()
参数
无。
返回值
返回一个 dict_values 视图对象,包含字典中的所有值。
该方法不会修改原字典,也不会直接创建一份独立的值列表。
实例
以下实例展示了 values() 方法的基本使用。
实例
tinydict = {
'Name': 'Runoob',
'Age': 7
}
values = tinydict.values()
print(values)
print(type(values))
执行结果:
dict_values(['Runoob', 7]) <class 'dict_values'>
可以看到,values() 返回的是 dict_values 对象,而不是普通列表。
实例 2:遍历字典中的值
可以通过 for 循环遍历 values() 返回的视图。
实例
'eggs': 2,
'sausage': 1,
'bacon': 1,
'spam': 500
}
for value in dishes.values():
print(value)
执行结果:
2 1 1 500
由于 Python 3.7 及以上版本保证字典保留插入顺序,因此遍历的值与键的插入顺序相对应。
实例 3:计算字典中所有值的总和
如果字典中的值都是数字,可以使用 sum() 函数计算总和。
实例
'eggs': 2,
'sausage': 1,
'bacon': 1,
'spam': 500
}
total = sum(dishes.values())
print("总数:", total)
执行结果:
总数: 504
使用 sum(dishes.values()) 可以直接对字典中的数值求和,不需要手动编写循环。
注意:如果字典中的值包含字符串等不支持相加的类型,直接使用 sum() 可能引发 TypeError。
实例 4:将 values() 转换为列表
由于 dict_values 对象不支持索引,因此不能直接使用下标访问其中的元素。
如果需要按照位置访问,可以先转换为列表。
实例
'Name': 'Runoob',
'Age': 7,
'Site': 'www.runoob.com'
}
values_list = list(tinydict.values())
print(values_list)
print(values_list[0])
print(values_list[1])
执行结果:
['Runoob', 7, 'www.runoob.com'] Runoob 7
需要注意,list() 创建的是一个新的列表。字典后续新增、删除键值对或重新赋值,不会自动改变这个列表中的对应元素。
不过,该转换属于浅拷贝:如果值本身是列表等可变对象,列表副本与字典仍可能引用同一个内部对象。
实例 5:视图对象的动态更新
values() 返回的视图与原字典保持关联,因此当字典发生变化时,不需要重新调用 values()。
实例
'eggs': 2,
'sausage': 1,
'bacon': 1,
'spam': 500
}
# 获取视图对象
values = dishes.values()
print(list(values))
# 修改字典中的值
dishes['eggs'] = 5
print(list(values))
# 删除字典中的元素
del dishes['sausage']
del dishes['eggs']
print(list(values))
执行结果:
[2, 1, 1, 500] [5, 1, 1, 500] [1, 500]
可以看到,values 始终引用原字典的动态视图。
原字典更新后,再次使用 list(values) 即可获取当时的值。
实例 6:判断某个值是否存在
values() 支持使用 in 运算符判断指定值是否存在于字典中。
实例
'name': 'Runoob',
'age': 7,
'city': 'Beijing'
}
print('Runoob' in student.values())
print('Shanghai' in student.values())
print(7 in student.values())
执行结果:
True False True
需要注意,字典通常可以高效判断某个键是否存在,但通过 values() 查找值通常需要逐个比较,时间复杂度一般为 O(n)。
实例 7:字典的值允许重复
字典中的键必须唯一,但不同的键可以对应相同的值。
因此,values() 返回的视图也可能包含重复元素。
实例
'Tom': 90,
'Jack': 85,
'Lucy': 90,
'Mike': 85
}
print(list(scores.values()))
# 对值进行去重
unique_scores = set(scores.values())
print(sorted(unique_scores))
执行结果:
[90, 85, 90, 85] [85, 90]
如果需要对字典中的值进行去重,可以使用 set(),但前提是这些值必须可哈希。
实例 8:两个 values() 视图的比较
与普通列表不同,dict_values 视图不按照元素内容进行相等性比较。
即使两个视图来自同一个字典,比较结果仍然可能为 False。
实例
print(d.values() == d.values())
values = d.values()
print(values == values)
# 转换为列表后比较内容
print(list(d.values()) == list(d.values()))
执行结果:
False True True
这里需要特别区分:
d.values() == d.values():每次调用都会创建新的视图对象,结果为False。values == values:同一个视图对象与自身比较,结果为True。list(d.values()) == list(d.values()):比较的是列表中的元素内容,结果为True。
如果需要比较两个字典是否具有相同的键值对,通常应该直接比较字典,而不是比较 values() 视图。
values()、keys() 和 items() 的区别
Python 字典提供了三个常用的视图方法:
| 方法 | 返回内容 | 示例 |
|---|---|---|
keys() |
字典中的所有键 | dict_keys(['a', 'b']) |
values() |
字典中的所有值 | dict_values([1, 2]) |
items() |
字典中的所有键值对 | dict_items([('a', 1), ('b', 2)]) |
例如:
实例
print(d.keys())
print(d.values())
print(d.items())
执行结果:
dict_keys(['a', 'b'])
dict_values([1, 2])
dict_items([('a', 1), ('b', 2)])
这三个方法返回的视图都会反映原字典的变化。
不过,keys() 视图具有集合式操作能力,而 values() 视图不被视为集合式对象,因为字典中的值可以重复。
注意事项
- 不能直接通过索引访问:
d.values()[0]会引发TypeError。 - 不能通过视图直接增删元素:应操作原字典,视图会自动反映变化。
- 不能依赖 values() 进行内容相等比较:需要时先转换为列表,或者根据业务需求采用其他比较方式。
- 遍历时尽量不要增删字典元素:可能引发
RuntimeError,也可能导致遍历不完整。 - 允许重复值:与字典的键不同,值没有唯一性要求。
- 顺序与字典一致:Python 3.7 及以上版本保证按键的插入顺序返回对应的值。
总结
Python 字典的 values() 方法用于获取字典中的所有值,并返回一个动态的 dict_values 视图对象。
它常用于遍历字典值、统计数值总和、判断某个值是否存在,以及将字典值转换为列表等场景。
在实际开发中,如果只需要遍历或读取字典中的值,可以直接使用 values();如果需要保留当前值的列表副本,则可以使用 list(d.values())。
Python3 字典
antilina
285***4560@qq.com
关于例子中 d.values() == d.values() 结果为 False 的问题:
我在交互式界面试了一下,发现每次 id(d.values()) 结果都不同,这可能导致例子中的比较结果为 False。
>>>d = {'a':1} >>>id(d) 1680560690624 >>>id(d.values()) 1680560502864 >>>id(d.values()) 1680560504496 >>>id(d.values()) 1680560500416>>d = {'a':1} >>>id(d) 1680560690624 >>>id(d.values()) 1680560502864 >>>id(d.values()) 1680560504496 >>>id(d.values()) 1680560500416" style="display: none;">>>d = {'a':1} >>>id(d) 1680560690624 >>>id(d.values()) 1680560502864 >>>id(d.values()) 1680560504496 >>>id(d.values()) 1680560500416" style="display: none;">然后继续试,发现不是交互也会存在这种情况,见下面的例子:
(针对这个例子,我将 "d.values() == d.values()" 语句都删除后,其他所有输出结果都相同,id 没有变化,不知道为什么,希望有大佬解答)
d = {'a':1} print(id(d.values())) #2769033635840 print(d.values() == d.values()) #False print(id(d.values())) #2769033638624 print(id(d.values()),id(d.values()),d.values() == d.values()) #2769033638624 2769033638624 False print(id(d.values())) #2769033635840 print(id(d.values())) #2769033635840但是对于类似的 dict.keys() 与 dict.items() 却有所不同。
>>>d = {'a':1} >>>d.keys() == d.keys() True >>>d.items() == d.items() True>>d = {'a':1} >>>d.keys() == d.keys() True >>>d.items() == d.items() Tr " style="display: none;">我还发现 id(d.keys()) 也是会变的,但是会出现重复的情况,并且存在在几个 id 值之间来回重复的情况,id(d.items()) 也是这样。
在交互界面中,还有以下一个例子:
>>>d = {'a':1} >>>id(d.keys()),id(d.values()),id(d.items()) (2196330461840, 2196330461840, 2196330461840)发现三个 id 值是一样的,但是如果分成三条语句,结果又不同了。
这些是我试验的结果,但是我不知道为什么id会不断的变化,以及为什么只有 id(d.values()) == id(d.values()) 的结果是 False,希望能有大佬解释一下原因,谢谢。
antilina
285***4560@qq.com