【零基础入门学习Python---Python的五大数据类型之字典类型】

一.Python的五大数据类型之字典类型

Python中的字典是一种无序的可变容器,可以存储任意数量的键值对。接下来我们就来学习一下五大数据类型之字典类型。

在这里插入图片描述

1.1 什么是字典

  1. 字典的键必须是唯一的,而值则可以是任意类型的对象,如字符串、数字、列表、元组等。字典的键是不可变类型,如字符串、数字、元组,而列表等可变类型则不能作为键。

  2. 字典的实现是通过哈希表实现的,因此查找、插入和删除操作的时间复杂度都是O(1)。

1.2 创建字典

创建字典的方式有多种,下面是其中两种常见的方式:

1.2.1 方式1:直接创建字典

# 直接创建字典
dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1)  # 输出 {'name': 'Tom', 'age': 18, 'gender': 'male'}

1.2.2 方式2:使用dict()函数创建字典

dict2 = dict(name='Jerry', age=20, gender='female')
print(dict2)  # 输出 {'name': 'Jerry', 'age': 20, 'gender': 'female'}

1.3 字典的基本操作

1.3.1 添加元素

可以通过以下方式向字典中添加元素:

# 添加一个键值对
dict1['address'] = 'Beijing'
print(dict1)  # 输出 {'name': 'Tom', 'age': 18, 'gender': 'male', 'address': 'Beijing'}

# 更新一个键的值
dict1['age'] = 19
print(dict1)  # 输出 {'name': 'Tom', 'age': 19, 'gender': 'male', 'address': 'Beijing'}

# 批量添加元素
dict1.update({
    
    'email': '[email protected]', 'phone': '123456789'})
print(dict1)  # 输出 {'name': 'Tom', 'age': 19, 'gender': 'male', 'address': 'Beijing', 'email': '[email protected]', 'phone': '123456789'}

1.3.2 删除元素

可以通过以下方式从字典中删除元素:

# 删除一个键值对
del dict1['address']
print(dict1)  # 输出 {'name': 'Tom', 'age': 19, 'gender': 'male', 'email': '[email protected]', 'phone': '123456789'}

# 清空字典
dict1.clear()
print(dict1)  # 输出 {}

1.3.3 访问元素

可以通过键访问字典中的值:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1['name'])  # 输出 Tom

需要注意的是,如果使用不存在的键来访问字典中的值,将会引发KeyError异常。可以使用get()方法来避免这种情况的发生,如果键不存在,则返回None或指定的默认值:

print(dict1.get('address'))  # 输出 None
print(dict1.get('address', 'unknown'))  # 输出 unknown

1.3.4 遍历字典

可以使用for循环继续遍历字典:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
# 遍历键
for key in dict1:
    print(key)

# 遍历值
for value in dict1.values():
    print(value)

# 遍历键值对
for key, value in dict1.items():
    print(key, value)

1.4 字典的基本方法

1.4.1 keys()

keys()方法返回字典中所有键的列表:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1.keys())  # 输出 dict_keys(['name', 'age', 'gender'])

需要注意的是,keys()方法返回的是dict_keys类型的对象,而非列表类型,但是可以像列表一样使用。

1.4.2 values()

values()方法返回字典中所有值的列表:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1.values())  # 输出 dict_values(['Tom', 18, 'male'])

同样,values()方法返回的是dict_values类型的对象,而非列表类型,但是可以像列表一样使用。

1.4.3 items()

items()方法返回字典中所有键值对的列表,每个键值对以元组的形式呈现:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1.items())  # 输出 dict_items([('name', 'Tom'), ('age', 18), ('gender', 'male')])

同样,items()方法返回的是dict_items类型的对象,而非列表类型,但是可以像列表一样使用。

1.4.4 pop()

pop()方法可以从字典中删除指定的键值对,并返回对应的值,如果键不存在,则返回指定的默认值:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
value = dict1.pop('age')
print(value)  # 输出 18
print(dict1)  # 输出 {'name': 'Tom', 'gender': 'male'}

1.4.5 popitem()

popitem()方法可以随机删除字典中的一个键值对,并返回对应的键和值:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
key, value = dict1.popitem()
print(key, value)  # 输出 gender male
print(dict1)  # 输出 {'name': 'Tom', 'age': 18}

1.4.6 update()

update()方法可以将一个字典中的元素添加到另一个字典中,如果有相同的键,则用新字典中的值覆盖原字典中的值:

dict1 = {
    
    'name': 'Tom', 'age': 18, 'gender': 'male'}
dict2 = {
    
    'name': 'Jerry', 'email': '[email protected]'}
dict1.update(dict2)
print(dict1)  # 输出{'name': 'Jerry', 'age': 18, 'gender': 'male', 'email': '[email protected]'}

1.5 实操案例代码

1.5.1 案例一:统计字符串中每个字符出现的次数

def count_char(str1):
    char_dict = {
    
    }
    for char in str1:
        if char in char_dict:
            char_dict[char] += 1
        else:
            char_dict[char] = 1
    return char_dict

str1 = 'hello, world!'
print(count_char(str1))
# 输出 {'h': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}

1.5.2 案例二:合并多个字典

dict1 = {
    
    'name': 'Tom', 'age': 18}
dict2 = {
    
    'gender': 'Male'}
dict3 = {
    
    'email': '[email protected]'}

dict4 = {
    
    }
for d in (dict1, dict2, dict3):
    dict4.update(d)

print(dict4)
# 输出 {'name': 'Tom', 'age': 18, 'gender': 'Male', 'email': '[email protected]'}

1.5.3 案例三:根据字典中的值对字典排序

def sort_dict(dict1):
    dict2 = {
    
    k: v for k, v in sorted(dict1.items(), key=lambda item: item[1])}
    return dict2

dict1 = {
    
    'Tom': 75, 'Jerry': 90, 'Alice': 80, 'Bob': 85}
print(sort_dict(dict1))
# 输出 {'Tom': 75, 'Alice': 80, 'Bob': 85, 'Jerry': 90}

1.5.4 将列表转换为字典

keys = ['name', 'age', 'gender']
values = ['Tom', 18, 'Male']

dict1 = dict(zip(keys, values))

print(dict1)
# 输出 {'name': 'Tom', 'age': 18, 'gender': 'Male'}

1.5.5 使用字典实现一个简单的缓存

def fibonacci(n):
    if n in cache:
        return cache[n]

    if n < 2:
        result = n
    else:
        result = fibonacci(n - 1) + fibonacci(n - 2)

    cache[n] = result
    return result

1.6 字典的排序方法,升序以及降序

对于字典的排序,可以使用内置的 sorted() 函数或 sorted() 方法来实现,也可以使用 collections.OrderedDict 类来保持排序顺序。

下面分别介绍这些方法的升序和降序排序。

1.6.1 使用内置函数 sorted() 进行排序

使用内置函数 sorted() 可以对字典进行排序。默认情况下,sorted() 按照字典中的键进行升序排序。可以使用 reverse=True 参数来实现降序排序。

# 升序排序
d = {
    
    'b': 2, 'a': 1, 'c': 3}
sorted_d = sorted(d.items())
print(sorted_d)  # [('a', 1), ('b', 2), ('c', 3)]

# 降序排序
sorted_d_desc = sorted(d.items(), reverse=True)
print(sorted_d_desc)  # [('c', 3), ('b', 2), ('a', 1)]


1.6.2 使用字典的 sorted() 方法进行排序

使用字典的 sorted() 方法可以按照字典中的键或值进行排序。与 sorted() 函数一样,该方法默认按照字典中的键进行升序排序,并且可以使用 reverse=True 参数来实现降序排序。

# 升序排序
d = {
    
    'b': 2, 'a': 1, 'c': 3}
sorted_d = sorted(d.items())
print(sorted_d)  # [('a', 1), ('b', 2), ('c', 3)]

# 按值进行排序
sorted_d_value = sorted(d.items(), key=lambda x: x[1])
print(sorted_d_value)  # [('a', 1), ('b', 2), ('c', 3)]

# 降序排序
sorted_d_desc = sorted(d.items(), key=lambda x: x[0], reverse=True)
print(sorted_d_desc)  # [('c', 3), ('b', 2), ('a', 1)]

1.6.3 使用 collections.OrderedDict 类进行排序

collections.OrderedDict 类可以保持字典中元素的插入顺序,并且支持排序功能。默认情况下,OrderedDict 按照字典中的键进行升序排序。可以使用 reverse=True 参数来实现降序排序。

from collections import OrderedDict

# 升序排序
d = {
    
    'b': 2, 'a': 1, 'c': 3}
sorted_d = OrderedDict(sorted(d.items()))
print(sorted_d)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 按值进行排序
sorted_d_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))
print(sorted_d_value)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 降序排序
sorted_d_desc = OrderedDict(sorted(d.items(), key=lambda x: x[0], reverse=True))
print(sorted_d_desc)  # OrderedDict([('c', 3), ('b', 2), ('a', 1)])

二.注意事项

  1. 字典的键必须是可哈希的,也就是说,键必须是不可变的类型,比如数字、字符串、元组等,而列表和字典等可变类型是不可以作为键的。

  2. 字典是无序的,如果需要有序的字典,可以使用collections模块中的OrderedDict类。

  3. 在Python3中,keys()、values()、items()等方法返回的不再是列表类型,而是dict_keys、dict_values、dict_items类型的对象,但是可以像列表一样使用。

  4. 字典的遍历顺序可能会随机变化,因此在遍历时需要注意顺序的问题。

  5. 字典的操作是原地修改,也就是说,对字典进行的任何修改都会影响原始的字典,因此在进行操作时需要注意备份的问题。

三.总结

  1. 总的来说,Python中的字典类型是一种非常有用的数据类型,可以用来存储键值对,其基本用法和列表、元组等数据类型类似,但是字典的键值对是无序的,且键必须是不可变类型。

  2. 字典类型的基本用法包括创建字典、访问字典中的元素、修改字典中的元素、删除字典中的元素等操作。另外,字典类型也提供了一些基本的方法,如keys()、values()、items()等,可以用来访问字典中的键、值、键值对等。

  3. 字典类型也有一些高级用法,如遍历字典、合并多个字典、将列表转换为字典、使用字典实现一个简单的缓存等操作,这些操作可以帮助我们更好地利用字典类型来解决实际问题。

  4. 在使用字典类型时,需要注意字典是无序的,键必须是不可变类型,同时还要注意避免使用不恰当的键或值类型、重复的键等问题。

  5. 此外,在使用字典类型时,还需要注意一些性能问题。由于字典类型使用哈希表来实现,所以在访问字典中的元素时,其速度是非常快的,但是在插入和删除元素时,由于哈希表的重新哈希和扩容等操作,可能会导致性能下降。因此,在需要频繁插入和删除元素的情况下,应该考虑使用其他数据类型来替代字典类型。

  6. 最后,需要注意的是,字典类型虽然非常灵活和方便,但是在处理大量数据时可能会导致内存占用过大的问题。因此,在需要处理大量数据时,需要谨慎使用字典类型,并尽可能地使用一些高效的算法和数据结构来减少内存占用。

猜你喜欢

转载自blog.csdn.net/Coder_ljw/article/details/129471347