Python:字典,


blog:https://www.cnblogs.com/Rohn

Tips:本文中代码均使用3.8.x版本的Python。

部分文字来自网络,侵删。

目录

  • 字典
    • 语法格式
    • 字典与列表的区别
  • 字典的方法
    • 字典的键、值和键-值对
    • get()方法
    • setdefault()方法
  • 常见问题解决方案
    • 字典中的键映射多个值
      • 问题
      • 解决方案
    • 字典的运算
      • 问题
      • 解决方案

字典

像列表一样,字典是许多值的集合。但不像列表的下标,字典的索引可以使用许多不同数据类型,不只是整数。字典的索引被称为“键”,键及其关联的值称为键-值对。

语法格式

dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}

例如

myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}

将一个字典赋给myCat变量。这个字典的键是'size''color''disposition'。这些键相应的值是'fat''gray''loud'。可以通过它们的键访问这些值:

>>> myCat['size']
'fat'

字典仍然可以用整数值作为键, 就像列表使用整数值作为下标一样, 但它们不必从0开始,可以是任何数字。

a = {12: 'fish', 523: 'lion'}

字典与列表的区别

不像列表,字典中的表项是不排序的。但字典中没有“第一个”表项。虽然确定两个列表是否相同时,表项的顺序很重要,但在字典中,键-值对输入的顺序并不重要。

>>> a = ['dog','fish','cat']
>>> b = ['fish','dog','cat']
>>> a == b
False
>>> a={3:'dog',23:'cat',53:'fish'}
>>> b={23:'cat',3:'dog',53:'fish'}
>>> a == b
True

因为字典是不排序的,所以不能像列表那样切片。尝试访问字典中不存在的键,将导致KeyError出错信息。这很像列表的“越界”IndexError出错信息。

>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> myCat['age']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'age'

字典的方法

字典的键、值和键-值对

字典的键、值和键-值对:keys()values()items()
利用keys()values()items()方法,循环分别可以迭代键、值或键-值对。请注意,items()方法返回的dict_items值中,包含的是键和值的元组。

>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> for i in myCat.values():
...  print(i)
...
fat
gray
loud

>>> for i in myCat.keys():
...  print(i)
...
size
color
disposition

>>> for i in myCat.items():
...  print(i)
...
('size', 'fat')
('color', 'gray')
('disposition', 'loud')

通过innot in检查某个键或值是否存在于字典中。

>>> 'name' in myCat.keys()
False
>>> 'size' in myCat.keys()
True
>>> 'gray' in myCat.values()
True
>>> 'gray' not in myCat.values()
False

get()方法

字典有一个get()方法,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。

a = {'cat': 2,'dog': 5,'fish': 10}
>>> 'I have ' + str(a.get('fish', 0)) + ' fish.'
'I have 10 fish.'
>>> 'I have ' + str(a.get('bird', 0)) + ' birds.'
'I have 0 birds.'

setdefault()方法

setdefault()方法提供了一种方式,在一行中完成这件事。传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。

 a = {'cat': 2,'dog': 5,'fish': 10}
>>> a.setdefault('bird',3)
3
>>> a
{'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
>>> a.setdefault('bird',6)
3
>>> a
{'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}

常见问题解决方案

字典中的键映射多个值

问题

怎样实现一个键对应多个值的字典?

解决方案

如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面。例如:

d = {
    'a' : [1, 2, 3],
    'b' : [4, 5]
}
e = {
    'a' : {1, 2, 3},
    'b' : {4, 5}
}

选择使用列表还是集合取决于你的实际需求。如果你想保持元素的插入顺序就应该使用列表, 如果想去掉重复元素就使用集合(并且不关心元素的顺序问题)。

字典的运算

问题

怎样在数据字典中执行一些计算操作,比如求最小值、最大值?

以下是蔬菜价格的数据字典:

vegetables = {
    'tomato': 3.50,
    'potato': 2.32,
    'cucumber': 1.75,
    'eggplant': 5.15,
    'pepper': 8.99
}

找出价格最便宜的蔬菜和最贵的蔬菜。

解决方案

如果你在一个字典上执行普通的数学运算,你会发现它们仅仅作用于键,而不是值。比如:

print(min(vegetables)) # Returns 'cucumber'
print(max(vegetables)) # Returns 'tomato'

使用字典的 values() 方法来解决这个问题:

a = min(vegetables.values())
b = max(vegetables.values())
print(f'The lowest price for vegetables is {a}.')
print(f'The highest price for vegetables is {b}.')

输出结果为:

The lowest price for vegetables is 1.75.
The highest price for vegetables is 8.99.

但不是最终需要得到的结果,最终需要知道最低和最高价格的蔬菜。

zip() 函数方案通过将字典”反转”为 (值,键) 元组序列来解决了上述问题。

a = min(zip(vegetables.values(),vegetables.keys()))
b = max(zip(vegetables.values(),vegetables.keys()))
print(f'The lowest price for vegetables is {a}')
print(f'The highest price for vegetables is {b}')

输出结果为:

The lowest price for vegetables is (1.75, 'cucumber')
The highest price for vegetables is (8.99, 'pepper')

相关内容

    暂无相关文章

评论关闭