当我们在Python中使用dict
(字典)和set
(集合)这两种数据结构时,它们的背后其实有许多小秘密。在本文中,我们将简要地介绍这些秘密。
Python字典(dict)的小秘密
接受任意类型作为键名
Python的字典是一种哈希表,允许使用任意可哈希(hashable)的数据类型作为键名。哈希表使用键名的哈希值来快速定位键值对,因此键名必须是不可变的(immutable)。常见的可哈希类型包括整数、字符串、元组。
不过,Python的字典却非常灵活,甚至可以使用自定义的类作为键名。如果自定义类没有实现哈希值和相等性比较,那么Python会自动为其生成哈希值,并根据对象的id来比较它们是否相等。下面是一个简单的示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
d = {Person('Alice', 25): 'Alice is 25 years old.'}
print(d[Person('Alice', 25)])
在这个例子里,我们使用自定义的Person
类作为字典的键名,不过我们并没有为其实现哈希值和相等性比较。不过,由于Person
类的每个实例都有唯一的id,因此在字典中它们会被视作不同的键名。
插入顺序是有利于查询的
在Python字典中,键值对的插入顺序会被保留。这个特性是从Python 3.7版本开始引入的,它意味着字典中的键值对可以按照插入顺序依次进行访问。比如说,我们可以使用collections.OrderedDict
类来创建一个带有插入顺序的字典,下面是一个简单的示例:
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
d['d'] = 4
print(d.keys()) # odict_keys(['a', 'b', 'c', 'd'])
在这个例子里,我们首先创建了一个空的OrderedDict
实例,然后依次插入了四个键值对。最后,我们使用keys()
方法来查看所有键名,发现它们的顺序正是我们插入时的顺序。
Python集合(set)的小秘密
可以用于列表去重
在Python中,我们可以使用集合来快速的对一个列表进行去重。集合可以保证其中的每个元素都是唯一的,因此我们只需要将列表转换为集合,然后再将其转换回列表即可。下面是一个简单的示例:
lst = [1, 2, 3, 1, 2, 3, 4, 5]
lst = list(set(lst))
print(lst) # [1, 2, 3, 4, 5]
在这个例子里,我们首先定义了一个包含重复元素的列表lst
,然后使用set()
函数将其转换为集合,并使用list()
函数将其转换回列表。最终,我们得到了一个没有重复元素的列表。
可以进行基本的集合操作
Python的集合不仅可以用来进行去重,还能进行一些基本的集合操作,例如并集、交集、差集等。这些操作都可以通过集合对象的方法来实现,下面是一些示例:
s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}
# 并集
print(s1.union(s2)) # {1, 2, 3, 4, 5, 6}
# 交集
print(s1.intersection(s2)) # {3, 4}
# 差集
print(s1.difference(s2)) # {1, 2}
# 对称差集
print(s1.symmetric_difference(s2)) # {1, 2, 5, 6}
在这个例子里,我们定义了两个集合s1
和s2
,并对其进行了一些基本的集合操作。可以看到,这些操作通过集合对象的方法比较容易实现,而且非常高效。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python里的dict和set的背后小秘密 - Python技术站