MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python字典与集合的用法

2021-02-123.7k 阅读

Python字典的用法

字典的定义与基本概念

在Python中,字典(Dictionary)是一种无序的、可变的数据结构,用于存储键值对(key - value pairs)。它就像是一本真正的字典,我们通过一个特定的“索引”(键)来查找与之对应的值。每个键在字典中必须是唯一的,而值则可以是任意的Python对象,包括数字、字符串、列表、甚至其他字典等。

字典使用花括号 {} 来定义,键值对之间用逗号 , 分隔,键和值之间用冒号 : 分隔。以下是一个简单的字典示例:

person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

在这个例子中,"name""age""city" 是键,而 "Alice"30"New York" 分别是对应的值。

字典的创建方式

  1. 直接赋值创建:如上面的 person 字典示例,这是最常见的创建字典的方式。通过直接在花括号内定义键值对,可以快速创建一个字典。
my_dict = {"key1": "value1", "key2": 42}
  1. 使用 dict() 函数创建dict() 函数可以通过多种方式创建字典。
    • 通过关键字参数
new_dict = dict(name="Bob", age=25)
print(new_dict)  
- **通过可迭代对象**:可迭代对象可以是包含键值对的元组列表、列表列表等。
items = [("a", 1), ("b", 2)]
dict_from_items = dict(items)
print(dict_from_items)  

访问字典中的值

要访问字典中的值,我们使用键作为索引。例如,对于前面定义的 person 字典:

person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}
print(person["name"])  
print(person["age"])  

如果试图访问一个不存在的键,Python会引发一个 KeyError 异常。为了避免这种情况,可以使用 get() 方法。get() 方法接受一个键作为参数,如果键存在,返回对应的值;如果键不存在,返回 None(或者可以指定一个默认返回值)。

print(person.get("name"))  
print(person.get("job"))  
print(person.get("job", "Unemployed"))  

修改和添加键值对

字典是可变的,这意味着我们可以随时修改已有的键值对,或者添加新的键值对。

  1. 修改现有键值对:通过直接给键赋值新的值来修改。
person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}
person["age"] = 31
print(person)  
  1. 添加新键值对:如果使用一个不存在的键进行赋值,就会在字典中添加一个新的键值对。
person["job"] = "Engineer"
print(person)  

删除键值对

  1. 使用 del 语句del 语句可以删除字典中的一个键值对。
person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}
del person["city"]
print(person)  
  1. 使用 pop() 方法pop() 方法删除指定键的键值对,并返回对应的值。如果键不存在,会引发 KeyError 异常(可以指定默认返回值避免异常)。
age = person.pop("age")
print(age)  
print(person)  
  1. 使用 popitem() 方法popitem() 方法删除并返回字典中的一个任意键值对(Python 3.7 及以上版本按插入顺序返回,之前版本是随机返回)。
person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}
item = person.popitem()
print(item)  
print(person)  

字典的遍历

  1. 遍历键:可以使用 for 循环直接遍历字典,默认遍历的是键。
person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}
for key in person:
    print(key)  

也可以使用 keys() 方法,它返回一个可迭代的键视图对象。

for key in person.keys():
    print(key)  
  1. 遍历值:使用 values() 方法,它返回一个可迭代的值视图对象。
for value in person.values():
    print(value)  
  1. 遍历键值对:使用 items() 方法,它返回一个可迭代的包含键值对的元组视图对象。
for key, value in person.items():
    print(key, value)  

字典推导式

字典推导式是一种简洁的创建字典的方式,类似于列表推导式。它的基本语法是 {key_expression: value_expression for item in iterable}

例如,创建一个将数字映射到其平方的字典:

squares = {num: num ** 2 for num in range(1, 6)}
print(squares)  

字典推导式也可以包含条件语句。例如,只包含偶数的平方:

even_squares = {num: num ** 2 for num in range(1, 6) if num % 2 == 0}
print(even_squares)  

字典的嵌套

字典可以嵌套,即一个字典的值可以是另一个字典。这在处理复杂数据结构时非常有用。

例如,一个存储学生信息的字典,每个学生又有自己的成绩字典:

students = {
    "Alice": {
        "math": 90,
        "english": 85
    },
    "Bob": {
        "math": 80,
        "english": 75
    }
}
print(students["Alice"]["math"])  

字典的常用方法

  1. clear() 方法:清空字典中的所有键值对。
my_dict = {"a": 1, "b": 2}
my_dict.clear()
print(my_dict)  
  1. copy() 方法:返回字典的一个浅拷贝。浅拷贝意味着新字典中的值是原字典值的引用,如果值是可变对象,修改新字典中的值可能会影响原字典。
original = {"a": [1, 2], "b": 3}
copied = original.copy()
copied["a"].append(3)
print(original)  
print(copied)  
  1. fromkeys() 方法:使用给定的可迭代对象作为键,创建一个新字典,并为每个键设置一个默认值(默认为 None)。
keys = ["a", "b", "c"]
new_dict = dict.fromkeys(keys, 0)
print(new_dict)  
  1. update() 方法:使用另一个字典或可迭代对象(包含键值对)来更新当前字典。如果键已存在,更新对应的值;如果键不存在,添加新的键值对。
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
dict1.update(dict2)
print(dict1)  

Python集合的用法

集合的定义与基本概念

集合(Set)是Python中的一种无序、可变的数据结构,它由唯一的元素组成。集合中的元素是不可重复的,这使得集合在去除重复数据、进行成员测试以及数学集合运算(如并集、交集、差集等)时非常有用。

集合使用花括号 {}set() 函数来创建。注意,当使用花括号创建空集合时,实际上创建的是一个空字典,所以创建空集合需要使用 set() 函数。以下是创建集合的示例:

fruits = {"apple", "banana", "cherry"}
numbers = set([1, 2, 3, 3, 4])  
print(numbers)  

numbers 集合中,重复的 3 只会出现一次。

集合的创建方式

  1. 使用花括号创建
my_set = {1, 2, 3}
  1. 使用 set() 函数创建
    • 从可迭代对象创建:可以将列表、元组、字符串等可迭代对象转换为集合。
my_list = [1, 2, 2, 3]
set_from_list = set(my_list)
print(set_from_list)  
- **创建空集合**:
empty_set = set()

集合的基本操作

  1. 添加元素
    • 使用 add() 方法add() 方法用于向集合中添加一个元素。如果元素已经存在,不会有任何效果。
fruits = {"apple", "banana"}
fruits.add("cherry")
print(fruits)  
- **使用 `update()` 方法**:`update()` 方法用于添加多个元素,可以接受列表、元组、集合等可迭代对象作为参数。
more_fruits = ["orange", "grape"]
fruits.update(more_fruits)
print(fruits)  
  1. 删除元素
    • 使用 remove() 方法remove() 方法用于删除集合中的指定元素。如果元素不存在,会引发 KeyError 异常。
fruits = {"apple", "banana", "cherry"}
fruits.remove("banana")
print(fruits)  
- **使用 `discard()` 方法**:`discard()` 方法也用于删除集合中的指定元素,但如果元素不存在,不会引发异常。
fruits.discard("pear")
print(fruits)  
- **使用 `pop()` 方法**:`pop()` 方法随机删除并返回集合中的一个元素。如果集合为空,会引发 `KeyError` 异常。
element = fruits.pop()
print(element)  
print(fruits)  
- **使用 `clear()` 方法**:`clear()` 方法清空集合中的所有元素。
fruits.clear()
print(fruits)  

集合的遍历

集合是可迭代的,可以使用 for 循环来遍历集合中的元素。由于集合是无序的,遍历的顺序是不确定的。

fruits = {"apple", "banana", "cherry"}
for fruit in fruits:
    print(fruit)  

集合推导式

集合推导式与列表推导式和字典推导式类似,是一种简洁的创建集合的方式。其基本语法是 {expression for item in iterable if condition}

例如,创建一个包含 1 到 10 中所有偶数的集合:

even_numbers = {num for num in range(1, 11) if num % 2 == 0}
print(even_numbers)  

集合的数学运算

  1. 并集:并集是包含两个集合中所有元素的集合(去除重复元素)。可以使用 | 运算符或 union() 方法来计算并集。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1 | set2
print(union_set)  
union_set_using_method = set1.union(set2)
print(union_set_using_method)  
  1. 交集:交集是包含两个集合中共同元素的集合。可以使用 & 运算符或 intersection() 方法来计算交集。
intersection_set = set1 & set2
print(intersection_set)  
intersection_set_using_method = set1.intersection(set2)
print(intersection_set_using_method)  
  1. 差集:差集是在一个集合中但不在另一个集合中的元素组成的集合。对于 set1 - set2,返回在 set1 中但不在 set2 中的元素。可以使用 - 运算符或 difference() 方法来计算差集。
difference_set = set1 - set2
print(difference_set)  
difference_set_using_method = set1.difference(set2)
print(difference_set_using_method)  
  1. 对称差集:对称差集是包含在两个集合中但不同时在两个集合中的元素的集合。可以使用 ^ 运算符或 symmetric_difference() 方法来计算对称差集。
symmetric_difference_set = set1 ^ set2
print(symmetric_difference_set)  
symmetric_difference_set_using_method = set1.symmetric_difference(set2)
print(symmetric_difference_set_using_method)  

集合的比较

  1. 子集判断:可以使用 <= 运算符或 issubset() 方法来判断一个集合是否是另一个集合的子集。如果集合 A 的所有元素都在集合 B 中,那么 AB 的子集。
setA = {1, 2}
setB = {1, 2, 3}
print(setA <= setB)  
print(setA.issubset(setB))  
  1. 超集判断:使用 >= 运算符或 issuperset() 方法来判断一个集合是否是另一个集合的超集。如果集合 A 包含集合 B 的所有元素,那么 AB 的超集。
print(setB >= setA)  
print(setB.issuperset(setA))  

不可变集合(frozenset)

Python还提供了一种不可变的集合类型,即 frozenset。一旦创建,frozenset 的元素不能被修改。frozenset 可以作为字典的键,也可以作为其他集合的元素,而普通集合则不行,因为普通集合是可变的,不符合字典键或集合元素的不可变要求。

创建 frozenset 使用 frozenset() 函数:

frozen_set = frozenset([1, 2, 3])
print(frozen_set)  

frozenset 支持大部分集合的方法,但由于其不可变性,不支持添加或删除元素的方法。例如,add()remove() 等方法对 frozenset 无效。

通过深入了解Python字典和集合的用法,我们能够在编程中更有效地处理数据,利用它们各自的特性来解决各种实际问题,无论是数据存储、数据处理还是集合运算等方面。这些数据结构为Python编程提供了强大的工具,熟练掌握它们对于编写高效、简洁的代码至关重要。

在实际应用中,比如在数据清洗时,可以利用集合的特性去除重复数据;在统计数据出现次数时,字典可以很好地作为计数器使用。同时,对于复杂数据结构的构建,字典的嵌套和集合的数学运算等功能都能发挥巨大作用,帮助我们实现各种业务逻辑和算法。随着对Python编程的深入学习,字典和集合的使用场景会越来越广泛,成为我们编程工具库中不可或缺的部分。

希望通过本文的介绍,读者能够对Python字典和集合的用法有一个全面且深入的理解,从而在日常编程中能够灵活运用它们来优化代码、提高编程效率。在实际项目中,不断地实践和总结,将有助于更好地掌握这两种重要的数据结构,并发现更多它们潜在的应用场景。

在处理大规模数据时,合理使用字典和集合的特性可以显著提高程序的性能。例如,在查找大量数据中的唯一元素时,使用集合能够快速实现去重操作;而在进行数据映射时,字典能够高效地根据键获取对应的值。

同时,在多线程或并发编程环境中,需要注意字典和集合的线程安全性。由于它们不是线程安全的数据结构,在多个线程同时访问和修改时,可能会导致数据不一致或其他错误。在这种情况下,可能需要使用锁机制或其他线程安全的数据结构来确保程序的正确性。

在面向对象编程中,字典和集合也经常作为类的属性使用,用于存储和管理对象的相关数据。例如,一个表示学生的类,可以使用字典来存储学生的成绩信息,使用集合来存储学生参加的课程等。

随着Python版本的不断更新,字典和集合的一些特性和性能也可能会有所改进。例如,在Python 3.7及以上版本中,字典会保持插入顺序,这在一些需要依赖顺序的场景中非常有用。开发者需要关注这些变化,以便在编程中充分利用新特性带来的优势。

在数据分析领域,字典和集合常用于数据的预处理和特征提取。例如,将文本数据中的单词作为集合元素进行去重,然后使用字典来统计每个单词出现的频率。在机器学习中,字典也可以用于存储模型的参数等。

总之,Python字典和集合是功能强大且应用广泛的数据结构,深入理解它们的用法对于提升Python编程能力和解决实际问题具有重要意义。通过不断地实践和探索,我们能够发现更多它们在不同领域的应用方式,为我们的编程工作带来便利和效率的提升。无论是小型脚本还是大型项目,字典和集合都能在其中扮演重要的角色,帮助我们构建出更加健壮和高效的程序。