什么是 Python 中的字典?
Python 中的字典(或字典)是无序的项目集合。其他复合数据类型(如列表或元组)只有一个值作为元素,字典有一个键值对作为其元素。
字典允许您在知道键时轻松检索值。
如何创建 Python 字典?
在 Python 中创建字典所需要做的就是将项目放入大括号中,用逗号分隔。
让我们为《哈利·波特与魔法石》一书创建一个字典:
hp = {
'title': "Harry Potter and the Philosopher's Stone",
'author': "J.K. Rowling",
'publication': '1988-06-26'
}
如何从 Python 字典访问元素?
字典不像其他容器类型那样使用索引,而是使用键。键可以在方括号内使用,也可以使用 get() 方法。
当找不到键时,get() 方法返回 None 而不是 KeyError。
print(hp['title'])
#Output: Harry Potter and the Philosopher's Stone
print(hp.get('publication'))
#Output: 1988-06-26
什么是 Python 字典推导?
Python 字典推导式是创建字典的简洁方法,无需使用 for 循环。
类似于 Python 中的列表推导式。但是,他们不是创建列表,而是创建字典。
为什么要使用 Python 字典推导?
字典理解通常比编写复杂的 for 循环来完成同样的事情更简洁、更易于阅读。
每个词典推导都可以写成一个 for 循环(但不是每个 for 循环都可以写成字典推导。
然而,for 循环很长,可能很难遵循。
因为它们往往比 for 循环短得多,所以推导式使代码更加 Pythonic。
Python 中的字典推导旨在使代码更具可读性,同时不需要您编写显式的 for 循环。
你如何在 Python 中编写字典理解?
与 Python 中的列表推导式类似,字典推导式遵循以下模式:
- key:value 是指要创建的键值对
- 键和值不必不同,可以引用相同的值
- vars 是指 iterable 中的变量
- Iterable 是指可以循环访问的任何 Python 对象(例如列表、元组或字符串)
让我们尝试一个简单的例子:
字典推导示例:创建数字的平方
想象一下,您的任务是为数字 1 到 5 创建字典,其中:
- 密钥是原始号码,并且
- 该值是原始数的平方
我们可以编写以下代码:
squares = {i:i**2 for i in [1,2,3,4,5]}
print(squares)
这将返回以下字典:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
字典理解示例:从千克变为磅
想象一下,我们有一个字典,其中包含以千克为单位的项目的权重,我们想将这些权重转换为磅:
old_weights = {
'book': 0.5,
'milk': 2.0,
'tv': 7.0
}
new_weights = {key: value*2.2 for (key, value) in old_weights.items()}
print(new_weights)
这将返回以下输出:
{'book': 1.1, 'milk': 4.4, 'tv': 15.4}
如何向 Python 字典推导式添加条件(if-else 语句)?
在大多数代码片段中,条件被用作问题的解决方案。当我们向它们添加条件时,Python 字典推导变得更加强大,例如 if 和 if-else 语句。
将 IF 语句添加到 Python 字典推导式
如果我们有一个字典,其中包含例如人及其年龄的键值对,我们可以过滤字典以仅包括 25 岁以上的人:
ages = {
'kevin': 12,
'marcus': 9,
'evan': 31,
'nik': 31
}
new_ages = {key:value for (key, value) in ages.items() if value > 25}
print(new_ages)
这将返回:
{'evan': 31, 'nik': 31}
让我们来看看这是怎么写的:
dict = {k:v for var in iterable if condition}
IF 语句跟在可迭代项后面。
添加多个 IF 语句
如果我们想添加多个 if 语句(类似于 for 循环中的嵌套 if 语句),我们只需将它们链接在一起即可。
例如,如果我们想过滤我们的年龄列表,只包括年龄小于 25 且年龄为偶数(年龄模数 2 返回 0)的人,我们可以这样写:
ages = {
'kevin': 12,
'marcus': 9,
'evan': 31,
'nik': 31
}
younger = {key:value for (key, value) in ages.items() if value < 25 if value % 2 == 0}
print(younger)
这将返回以下内容:
{'kevin': 12}
如果我们想链接更多的 if 语句,我们只需按顺序编写它们。
提示:链接 if 语句与创建 AND 语句相同。
Python 字典推导 If Else
使用 IF-ELSE 语句可以使字典理解功能更加强大。使用我们前面的例子,如果我们想将年龄标记为奇数或偶数,我们可以写如下内容:
ages = {
'kevin': 12,
'marcus': 9,
'evan': 31,
'nik': 31
}
oddeven = {key:('odd' if value % 2 == 1 else 'even') for (key, value) in ages.items()}
print(oddeven)
这将返回以下内容:
{'kevin': 'even', 'marcus': 'odd', 'evan': 'odd', 'nik': 'odd'}
这里的结构略有不同。IF-ELSE 语句直接应用于该值,并放在括号中。在这种情况下,它用于转换值,而不是删除键值对。
Python 中的嵌套字典推导
Key:Value 对中的 Value 也可以是另一个字典推导式。
假设我们想要一个字典,其中包含值为 1 到 5 的键,每个值是另一个字典,其中包含键乘以 10 到 50 的间隔 10。
这可以通过编写以下内容来实现:
mutiples = {
key1: {
key2: key1 * key2
for key2 in range(1, 6)
}
for key1 in range(10, 60, 10)
}
print(mutiples)
这将返回以下内容:
{
10: {1: 10, 2: 20, 3: 30, 4: 40, 5: 50},
20: {1: 20, 2: 40, 3: 60, 4: 80, 5: 100},
30: {1: 30, 2: 60, 3: 90, 4: 120, 5: 150},
40: {1: 40, 2: 80, 3: 120, 4: 160, 5: 200},
50: {1: 50, 2: 100, 3: 150, 4: 200, 5: 250}
}
嵌套词典理解可能很难理解,所以如果你没有完全遵循这个例子,请不要担心!
需要注意的是,对于嵌套字典推导式,Python 从外部循环开始,然后(每个项目)移动到内部循环。
如何将枚举函数与 Python 字典推导式一起使用?
Python 枚举函数可用于标识列表、元组或字符串中项的索引。
这与字典推导相结合时特别有用,因为您可以创建标识索引或特定项目的字典。
让我们用一个例子来尝试一下。我们将创建一个项目列表,并可以创建一个字典来标识每个项目的索引。
字典推导示例:使用 Enumerate 函数
names = ['Harry', 'Hermione', 'Ron', 'Neville', 'Luna']
index = {k:v for (k, v) in enumerate(names)}
print(index)
这将返回以下内容:
{'Harry': 0, 'Hermione': 1, 'Ron': 2, 'Neville': 3, 'Luna': 4}
如果我们想知道一个项目的索引,这将特别有用。我们可以简单地使用我们之前学习的 get() 方法来检索索引。
如果我们想翻转键值对,使索引号排在第一位,我们可以这样写:
names = ['Harry', 'Hermione', 'Ron', 'Neville', 'Luna']
index = {k:v for (v, k) in enumerate(names)}
print(index)
这将返回以下内容:
{0: 'Harry', 1: 'Hermione', 2: 'Ron', 3: 'Neville', 4: 'Luna'}
Python 字典推导式示例
提取字典的子集
如果要从较大的字典中提取字典键值对的子集,则可以通过字典推导来实现。
让我们看一个例子。在下面的代码中,我们想从更大的字典中提取 a、b、c。
bigdict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
smalldict = {k: bigdict[k] for k in ('a', 'b', 'c')}
print(smalldict)
这将返回以下内容:
{'a': 1, 'b': 2, 'c': 3}
删除词典的项目
我们也使用字典推导法从字典中删除项目。假设我们有一本包含人们年龄的字典,我们想删除两个特定的人。
ages = {
'kevin': 12,
'marcus': 9,
'evan': 31,
'nik': 31
}
ages = {key:ages[key] for key in ages.keys() - {'marcus', 'nik'}}
print(ages)
这将返回以下内容:
{'evan': 31, 'kevin': 12}
反向键:字典中的值
我们可以使用字典推导来反转字典的键值项。请看下面的代码:
dictionary = {'key1': 'value1', 'key2':'value2'}
dictionary = {value:key for (key,value) in dictionary.items()}
让我们用一个例子来演示这一点:
user = {
'name': 'nik',
'age': 31,
'company': 'datagy'
}
user_reversed = {v: k for (k, v) in user.items()}
print(user_reversed)
这将返回以下内容:
{'nik': 'name', 31: 'age', 'datagy': 'company'}
Python 字典推导式警告
字典理解在编写方式上非常 Pythonic,但阅读起来也比 for 循环复杂得多。最好编写一个更长的 for 循环,使代码更易于理解,而不是将它们全部放在一行上。
请记住,未来的可读性很重要!