HOWTO · Python
Python 中的字典数组或列表
本教程演示了如何在 Python 中创建字典数组
本页内容
Python 列表通常用于存放一组字典:每个列表元素都可以保存一条由键值对组成的记录。虽然有时会把它称为字典数组,但 Python 列表与专用数组类型并不相同。下面的示例将介绍如何创建列表、访问记录及其值、追加记录和更新值。
当数据开始以一组记录的形式出现时,列表与字典的组合就成了基本功,Python 教程 对这类核心数据的处理方法做了系统的分组整理。
在 Python 中创建字典列表
将每个字典写成列表字面量中的一个元素。每个字面量都会创建一个独立的字典,因此各条记录可以使用不同的键,也可以共享部分键。请使用 records 这样的描述性变量名;list 已是 Python 内置名称。
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
records = [
{"name": "Ada", "role": "engineer"},
{"name": "Lin", "role": "designer"},
]
print(records)
[{'name': 'Ada', 'role': 'engineer'}, {'name': 'Lin', 'role': 'designer'}]
按索引和键访问字典及其值
Python 列表索引从 0 开始,因此索引 1 会选中第二个字典。要读取某个字段,先按列表索引选中字典,再用方括号中的键读取字段。列表查找和字典查找这两个步骤可以写在同一个表达式中。
本节中的代码以及显示的标签或输出仍为英文。
records = [
{"name": "Ada", "role": "engineer"},
{"name": "Lin", "role": "designer"},
]
second_record = records[1]
role = records[1]["role"]
print(second_record)
print(role)
{'name': 'Lin', 'role': 'designer'}
designer
要成功使用方括号查找,所选字典中必须存在该键。如果键可能不存在,可以使用 record.get("role"),其默认返回值为 None;也可以提供备用值,例如 record.get("role", "unknown")。
将字典追加到列表
调用 append() 可将一个字典添加到现有列表的末尾。它会原地修改列表,不会创建新列表。
本节中的代码以及显示的标签或输出仍为英文。
records = [{"name": "Ada", "role": "engineer"}]
records.append({"name": "Lin", "role": "designer"})
print(records)
[{'name': 'Ada', 'role': 'engineer'}, {'name': 'Lin', 'role': 'designer'}]
更新列表中的字典
先按索引选中一条记录,再通过键赋值来更改值。给不存在的键赋值会新增该键,因此这种写法既可以替换字段值,也可以添加字段。
本节中的代码以及显示的标签或输出仍为英文。
records = [{"name": "Ada", "role": "engineer"}]
records[0]["role"] = "lead engineer"
records[0]["team"] = "platform"
print(records)
[{'name': 'Ada', 'role': 'lead engineer', 'team': 'platform'}]
使用列表推导式创建字典列表
当每条记录遵循相同模式时,列表推导式可以让代码更简洁。在表达式中放入字典字面量,即可在每次迭代时创建一个独立的字典。例如,下面的代码会创建四个字段相同、彼此独立的字典:
本节中的代码以及显示的标签或输出仍为英文。
records = [{"active": True, "score": 0} for _ in range(4)]
print(records)
[{'active': True, 'score': 0}, {'active': True, 'score': 0}, {'active': True, 'score': 0}, {'active': True, 'score': 0}]
若要改为创建多个空字典,可以在每次迭代时调用 dict():
records = [dict() for _ in range(3)]
print(records)
[{}, {}, {}]
列表推导式也可以根据可迭代对象生成字段值:
records = [{"id": number, "label": f"item-{number}"} for number in range(3)]
print(records)
[{'id': 0, 'label': 'item-0'}, {'id': 1, 'label': 'item-1'}, {'id': 2, 'label': 'item-2'}]
不要通过重复包含同一个可变字典的列表来创建多条记录。例如,[{}] * 3 会重复引用同一个字典,因此修改一个元素后,三个位置都会体现出变化。使用包含 {} 的列表推导式,则会在每次迭代时创建一个新的字典。
在循环中创建字典
如果每个字典需要经过多个步骤或包含条件字段,可以使用循环。在每次迭代中创建一个新字典,然后将它追加到列表中。
本节中的代码以及显示的标签或输出仍为英文。
records = []
for number in range(3):
record = {"id": number, "score": number * 10}
records.append(record)
for record in records:
print(record)
{'id': 0, 'score': 0}
{'id': 1, 'score': 10}
{'id': 2, 'score': 20}
在这里,循环每执行一次,就会使用当前的 number 创建一条记录;在进入下一次迭代前,append() 会先将该字典存入列表。
使用 dict() 构造函数创建字典
不带参数调用 dict() 会创建一个空字典;也可以通过关键字字段创建字典。关键字名称会成为字符串键:
本节中的代码以及显示的标签或输出仍为英文。
blank_record = dict()
person = dict(name="John", age=30, city="New York")
print(blank_record)
print(person)
{}
{'name': 'John', 'age': 30, 'city': 'New York'}
在列表中创建字典时,可以分别调用 dict():
records = [
dict(name="Ada", role="engineer"),
dict(name="Lin", role="designer"),
]
for record in records:
print(record)
{'name': 'Ada', 'role': 'engineer'}
{'name': 'Lin', 'role': 'designer'}
字典的键必须是可哈希的,包括字符串、数字,以及由可哈希值组成的元组;列表等可变类型不能用作键。一个字典中的每个键最多出现一次。如果用重复的键值对构建字典,后面的值会替换前面的值。调用 dict() 时,每个关键字参数在一次调用中只能出现一次;如果输入可能包含重复键,请使用映射或键值对序列。