自学内容网 自学内容网

Python 散列类型:数据索引与处理的智慧密钥

目录

一、散列类型简介

(一)散列函数的概念

(二)散列类型在 Python 中的体现:字典(dict)和集合(set)

二、字典(dict)的详细介绍

(一)字典的创建与基本操作

(二)字典的遍历

三、集合(set)的详细介绍

(一)集合的创建与基本操作

(二)集合运算

四、散列类型的应用场景

(一)数据存储与快速查找

(二)数据去重

(三)缓存机制

五、内置方法(思维导图)


一、散列类型简介

在 Python 中,散列类型是一种非常重要的数据结构。它主要基于散列函数,能够将键(key)映射到特定的值(value),就像是给每个数据都贴上了一个独一无二的标签,通过这个标签就能快速地找到对应的数据。

(一)散列函数的概念

  • 散列函数是散列类型的核心。它接收一个输入(通常是键),然后通过一系列复杂的计算,输出一个固定长度的散列值。这个散列值就像是数据的 “指纹”,用于在散列表中确定数据的存储位置。
  • 例如,一个简单的散列函数可能会将字符串中的每个字符的 ASCII 码相加,然后对一个固定的数取模,得到一个散列值。

(二)散列类型在 Python 中的体现:字典(dict)和集合(set)

  • 字典(dict)
    • 字典是 Python 中最常用的散列类型之一。它由键 - 值对(key - value pairs)组成,其中键是唯一的,用于快速查找与之对应的键。
    • 例如,我们可以创建一个存储学生信息的字典:
student_info = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science"
}
  • 在这里,"name""age""major""Alice"20"Computer Science"是相应的。通过键,我们可以快速地获取对应的值,如student_info["name"]就会返回"Alice"
  • 集合(set)
    • 集合是一种无序的不包含重复元素的散列类型。它主要用于快速检查元素是否存在于集合中,以及进行集合运算(如并集、交集、差集等)。
    • 例如,创建一个包含一些水果名称的集合:
fruits = {"apple", "banana", "cherry"}
  • 我们可以快速检查一个水果是否在这个集合中,如"apple" in fruits会返回True

二、字典(dict)的详细介绍

(一)字典的创建与基本操作

  • 创建字典
    • 除了前面提到的直接使用花括号{}来创建字典外,还可以使用dict()函数来创建。
    • 例如:
# 使用dict()函数创建字典
new_dict = dict([("key1", "value1"), ("key2", "value2")])
print(new_dict)
  • 上述代码通过一个包含键 - 值对元组列表来创建字典,输出结果为{"key1": "value1", "key2": "value2"}
  • 访问字典中的值
    • 通过键来访问字典中的值。如果键不存在,会抛出KeyError异常。
    • 例如:
my_dict = {"a": 1, "b": 2}
print(my_dict["a"])  
  • 输出为1。为了避免KeyError,可以使用get()方法。
print(my_dict.get("c", "不存在该键"))  
  • 这里如果"c"键不存在,会返回"不存在该键"
  • 修改和添加字典中的元素
    • 修改字典中的元素很简单,直接通过键重新赋值即可。添加新元素也是同样的操作,如果键不存在,就会添加一个新的键 - 值对。
    • 例如:
my_dict = {"a": 1}
my_dict["a"] = 3  
# 修改键 "a" 对应的值
my_dict["b"] = 4  
# 添加新的键 - 值对
print(my_dict)
  • 输出为{"a": 3, "b": 4}

(二)字典的遍历

  • 遍历键
    • 可以使用for循环直接遍历字典的键
    • 例如:
my_dict = {"a": 1, "b": 2, "c": 3}
for key in my_dict.keys():
    print(key)
  • 会依次输出"a""b""c"
  • 遍历值
    • 同样,使用for循环遍历字典的值
    • 例如:
for value in my_dict.values():
    print(value)
  • 会依次输出123
  • 遍历键 - 值对
    • 使用for循环遍历字典的键 - 值对
    • 例如:
for key, value in my_dict.items():
    print(key, value)
  • 会依次输出("a", 1)("b", 2)("c", 3)

三、集合(set)的详细介绍

(一)集合的创建与基本操作

  • 创建集合
    • 可以使用花括号{}或者set()函数来创建集合。但是使用花括号创建空集合是不行的,因为{}会被认为是一个空字典
    • 例如:
# 使用花括号创建集合
fruits1 = {"apple", "banana", "cherry"}
# 使用set()函数创建集合
fruits2 = set(["apple", "banana", "cherry"])
print(fruits1 == fruits2)  
  • 输出为True,说明两种创建方式是等价的。
  • 添加和删除元素
    • 向集合中添加元素可以使用add()方法,删除元素可以使用remove()discard()方法。remove()方法在元素不存在时会抛出KeyError,而discard()方法不会。
    • 例如:
my_set = {"a", "b", "c"}
my_set.add("d")  
print(my_set)
my_set.remove("a")  
print(my_set)
my_set.discard("e")  
print(my_set)
  • 输出依次为{"a", "b", "c", "d"}{"b", "c", "d"}{"b", "c", "d"}

(二)集合运算

  • 并集
    • 可以使用|运算符或者union()方法来计算两个集合的并集
    • 例如:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2)  
print(set1.union(set2))  
  • 输出都是{1, 2, 3, 4, 5}
  • 交集
    • 使用&运算符或者intersection()方法来计算两个集合的交集。
    • 例如:
print(set1 & set2)  
print(set1.intersection(set2))  
  • 输出都是{3}
  • 差集
    • 使用-运算符或者difference()方法来计算两个集合的差集。
    • 例如:
print(set1 - set2)  
print(set1.difference(set2))  
  • 输出都是{1, 2}

四、散列类型的应用场景

(一)数据存储与快速查找

  • 在处理大量的数据时,如数据库中的用户信息存储。使用字典可以快速地根据用户 ID(键)查找用户的详细信息(值)。
  • 例如,在一个用户管理系统中,我们可以创建一个字典来存储用户信息:
users = {
    "user1": {"name": "John", "age": 30, "email": "john@example.com"},
    "user2": {"name": "Jane", "age": 25, "email": "jane@example.com"}
}
  • 当需要查找user1的信息时,只需要users["user1"]就可以快速获取相关信息。

(二)数据去重

  • 集合的不重复性使得它在数据去重方面有很大的优势。
  • 例如,从一个包含重复元素的列表中获取唯一元素:
my_list = [1, 2, 2, 3, 3, 3]
unique_list = set(my_list)
print(unique_list)
  • 输出为{1, 2, 3},实现了数据去重。

(三)缓存机制

  • 在一些计算密集型的应用中,为了避免重复计算,可以使用字典作为缓存。
  • 例如,计算斐波那契数列:
fib_cache = {}
def fibonacci(n):
    if n in fib_cache:
        return fib_cache[n]
    if n <= 1:
        result = n
    else:
        result = fibonacci(n - 1) + fibonacci(n - 2)
    fib_cache[n] = result
    return result
  • 在这里,fib_cache字典用于存储已经计算过的斐波那契数,下次需要计算相同的数时,直接从缓存中获取,提高了计算效率。

五、内置方法(思维导图)


原文地址:https://blog.csdn.net/2301_81718046/article/details/144082416

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!