1.背景介绍
字典(Dictionary)是一种可变容器模型,类似于JavaScript中的对象。它可以存储多个键值对,每个键对应的值可以是任意类型的数据,包括列表、元组、字符串甚至函数。列表和元组在字典中作为值的形式,可以使得字典更加灵活和强大。字典能够快速地访问值,并且提供了很多方法帮助我们处理和操控数据。本文将通过一些典型的案例学习如何使用字典。另外,本文也会学习到集合(Set),它也是一种容器模型。它不同于字典的地方在于集合只能存放不重复元素,并且没有对应的键值对,但它提供的方法却很丰富。最后,本文还会回顾一些重要的Python基本语法知识,例如索引、切片、迭代器等。希望通过本文,能让读者了解并掌握字典和集合的用法,并将其运用于实际项目开发中。
2.核心概念与联系
字典
字典是一种映射类型,它的每一个元素都由两个部分组成:一个是键,另一个是值。键必须是不可变类型,如字符串、数字或元组。值可以是任何类型的对象,包括列表、元组、字符串甚至函数。在字典中,每个键都是唯一的,也就是说不能存在相同的键。字典支持动态添加、删除键值对,并且可以根据键进行快速查找。因此,字典是非常灵活和高效的数据结构。
集合
集合(Set)是一个无序且元素不重复的集合。它可以用来保存、组织、搜索或者处理元素。集合和列表之间的区别主要在于是否允许有重复元素,集合仅保留唯一的元素。集合提供了一些方法,比如union、intersection、difference、symmetric difference等。
3.核心算法原理和具体操作步骤以及数学模型公式详细讲解
字典的创建与初始化
创建空字典
创建一个空字典可以使用{}符号。如:d = {}。
>>> d = {}
>>> type(d)
<class 'dict'>
使用关键字参数初始化字典
通过关键字参数的方式,可以初始化字典。
>>> d = {'a': 1, 'b': 2}
>>> print(d['a'])
1
>>> print(d['b'])
2
使用zip()函数初始化字典
如果我们有一个序列(如列表),想用序列的值作为键,则可以使用zip()函数打包两个序列,然后传递给字典的构造函数。如下例:
>>> keys = ['a', 'b']
>>> values = [1, 2]
>>> d = dict(zip(keys, values))
>>> print(d['a'])
1
>>> print(d['b'])
2
字典的访问、修改和删除元素
访问元素
访问字典中的元素可以通过键完成,如果键不存在,则返回报错。如下示例:
>>> d = {'a': 1, 'b': 2}
>>> print(d['a']) # 返回1
1
>>> print(d['c']) # KeyError: 'c'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'c'
修改元素
要修改字典中的元素,直接赋值即可。如下示例:
>>> d = {'a': 1, 'b': 2}
>>> d['a'] = 3 # 将字典中键为'a'的值修改为3
>>> print(d['a']) # 返回3
3
删除元素
要从字典中删除元素,使用del语句即可。如下示例:
>>> d = {'a': 1, 'b': 2}
>>> del d['b'] # 从字典中删除键为'b'的元素
>>> print(d) # 返回{'a': 1}
{'a': 1}
字典相等判断
字典之间相等判断可以使用==运算符。如果两个字典拥有完全相同的键值对,则认为它们相等;否则,它们就不等。
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'a': 1, 'b': 2}
>>> d3 = {'a': 1, 'b': 3}
>>> d1 == d2 # True
True
>>> d1 == d3 # False
False
get()方法
get()方法可用于获取指定键的值,也可以设置默认值。如下示例:
>>> d = {'a': 1, 'b': 2}
>>> d.get('a') # 返回1
1
>>> d.get('c') # 不存在c键时,返回None
None
>>> d.get('c', default=0) # 设置默认值为0
0
字典的遍历
字典遍历有两种方式,分别为key-value遍历和item遍历。
key-value遍历
这种遍历方式将按顺序返回所有的键-值对,并且不会返回键值对的顺序。
>>> d = {'a': 1, 'b': 2}
>>> for k, v in d.items():
print(k, v)
a 1
b 2
item遍历
这种遍历方式将按顺序返回所有的项(键-值对),并且会返回键值对的顺序。
>>> d = {'a': 1, 'b': 2}
>>> for k, v in sorted(d.items()):
print(k, v)
a 1
b 2
dict()方法
dict()方法用于将元组列表转换为字典。如下示例:
>>> items = [('a', 1), ('b', 2)]
>>> d = dict(items)
>>> print(d) # {'a': 1, 'b': 2}
{'a': 1, 'b': 2}
defaultdict()函数
defaultdict()函数是一个内置函数,用于为字典设置默认值。如下示例:
from collections import defaultdict
# 以列表作为默认值
d = defaultdict(list)
for i in range(3):
d[i].append(i+1)
print(d) # {0: [1], 1: [2], 2: [3]}
# 以0作为默认值
d = defaultdict(int)
for i in range(3):
d[str(i)] += 1
print(d) # {'0': 1, '1': 1, '2': 1}
Counter()函数
Counter()函数是一个内置函数,用于统计字典中的元素出现次数。如下示例:
from collections import Counter
words = "hello world".split()
word_count = Counter(words)
print(word_count) # Counter({'world': 1, 'hello': 1})
4.具体代码实例和详细解释说明
字典示例:进制转换
def base_converter(n, base):
"""
Convert decimal integer n to base given by base.
:param int n: Decimal number to be converted to another base
:param int base: Base to which the number will be converted
:return str: String representation of the converted number
"""
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if not isinstance(base, int) or base <= 1 or base > len(digits):
raise ValueError("Invalid input")
result = ""
while n > 0:
remainder = n % base
result = digits[remainder] + result
n //= base
return result or "0"
# Example usage:
print(base_converter(1453, 2)) # Output: 1111011011
print(base_converter(1453, 16)) # Output: 5AD
print(base_converter(0, 16)) # Output: 0
上述代码实现了一个转换二进制、十六进制等的函数,调用该函数只需传入相应的参数即可,例如base_converter(1453, 2)就可以将十进制整数1453转换为二进制表示。该函数首先定义了一个常量digits,其中包含了所有进制的数字及字母,方便进行转换。然后检查输入的有效性,确保基数为正整数且小于等于字符长度。接着采用余除法逐步将输入的数字转换为指定的进制,并存入结果变量中。最后判断结果是否为空(即为0),若为空,则返回“0”字符。
字典示例:学生信息管理
class StudentInfoManager:
def __init__(self):
self._students = []
self._students_by_name = {}
def add_student(self, name, rollno, marks):
student = {"Name": name, "RollNo": rollno, "Marks": marks}
self._students.append(student)
if name in self._students_by_name:
self._students_by_name[name].append(student)
else:
self._students_by_name[name] = [student]
def delete_student(self, name):
students = self._students_by_name.pop(name, [])
for s in students:
self._students.remove(s)
def update_marks(self, name, new_marks):
for student in self._students:
if student["Name"] == name:
student["Marks"] = new_marks
break
def search_student(self, keyword):
results = []
for student in self._students:
if keyword in student["Name"]:
results.append(student)
return results
def display_all_students(self):
for student in self._students:
print("{} - {}".format(student["Name"], student["Marks"]))
def display_students_by_roll_no(self, rollno):
for student in self._students:
if student["RollNo"] == rollno:
print("{} - {}".format(student["Name"], student["Marks"]))
break
# Example Usage:
manager = StudentInfoManager()
manager.add_student("Alice", 1, 80)
manager.add_student("Bob", 2, 90)
manager.add_student("Charlie", 3, 75)
manager.add_student("Alice", 4, 85)
manager.display_all_students() # Output: Alice - 80
# Bob - 90
# Charlie - 75
# Alice - 85
manager.delete_student("Bob")
manager.update_marks("Alice", 90)
manager.search_student("ice") # Output: [{"Name": "Alice", "RollNo": 1, "Marks": 90}]
manager.display_students_by_roll_no(3) # Output: Charlie - 75
这个代码实现了一个简单的学生信息管理系统,它使用了字典和列表来存储学生的信息。StudentInfoManager类定义了三个方法:add_student()用于添加学生信息,delete_student()用于删除学生信息,update_marks()用于更新学生分数信息,其他方法用于检索、打印和排序信息。为了避免同名学生导致覆盖,每次添加新学生信息时,都会将同名学生信息保存在列表和字典中。用户可以调用这些方法执行相关操作。
注意到这个程序假设姓名是唯一的,如果你需要同时管理多个同名学生,可能需要改进程序。