验证列表与集合、字典的计算效率 ·构建分别包含一千条、一万和十万条数据的数据源:电话本(由姓名 和电话号构成) 编写程序,分别查找其中任意名字或标识符的电话号码。给我完整的可执行的python代码
时间: 2024-09-09 14:14:25 浏览: 54
在Python中,我们可以使用三种数据结构来存储电话本:列表(List),集合(Set)以及字典(Dictionary)。它们各自有不同的特性和计算效率。
1. 列表(List): 具有序列,可以有重复元素,查找效率较低,时间复杂度为O(n)。
```python
phone_book_list = [{"name": "张三", "phone": "123456"}, ..., {"name": "李四", "phone": "789012"}]
```
2. 集合(Set): 无序且不允许重复,查找效率高,时间复杂度为O(1)到O(log n)之间,但是不保存原始键值对。
```python
# 将字典转成集合,但是无法直接获取电话号码,需要额外处理
phone_book_set = set((name, phone) for name, phone in phone_book_list)
```
3. 字典(Dictionary): 键值对形式,查找速度非常快,时间复杂度为O(1),可以直接通过键获取值。
```python
phone_book_dict = {name: phone for name, phone in phone_book_list}
```
针对不同规模(一千条、一万条和十万条),查找效率会有明显差异。对于大量数据,字典是最优选择。以下是查找函数示例:
```python
def find_phone(name, data_structure):
if isinstance(data_structure, list):
for entry in data_structure:
if entry['name'] == name or entry['phone'] == name: # 对于列表,假设电话号码也可以作为标识符
return entry['phone']
return None
elif isinstance(data_structure, dict):
return data_structure.get(name, None)
elif isinstance(data_structure, tuple): # 如果使用的是集合,需先转换回字典
phone_book_dict = dict(phone_book_set)
return phone_book_dict.get(name, None)
# 创建各种大小的电话本
phone_books = [
[{'name': 'A', 'phone': '1'}, {'name': 'B', 'phone': '2'}] * 1000,
[{'name': 'X', 'phone': 'x'}, {'name': 'Y', 'phone': 'y'}] * 10000,
[{'name': 'Z', 'phone': 'z'}, ...] * 100000,
]
# 查找示例
print(find_phone('A', phone_books[0]))
print(find_phone('X', phone_books[1]))
print(find_phone('Z', phone_books[2]))
```
阅读全文