了解Python中的集合
在计算机编程中,一个集合是一组类似的数据类型。这些单元类可以协助组织和管理相关项目。
集合的特点是数据结构有助于有效地管理大量的数据。Python中的collection 模块提供了各种各样的容器。
容器可以存储各种项目,并且可以重新创建。这些容器包括图元、列表、字典,以及更多。
在这篇文章中,我们将探讨在collections 模块中发现的一些容器。
前提条件
要理解本文的内容,你应该具备以下条件。
- 对Python编程有一定的了解。
- 安装了Python。
集合数据类型
如前所述,集合数据类型可以用来存储一个项目的集合。这些类型是
-
列表- 迭代生成的列表可以通过添加或删除元素来修改。要创建一个列表,使用方括号
[]。 -
集合- 在无序的、不可改变的唯一项目的集合中不允许有重复。一个数据类型的集合可以用来执行数学运算,如相交、联合和对称差。可以使用变量名后面的大括号或
set()构造函数来创建集合。 -
元组- 它们是一个有序的、不可改变的多个事物的序列,保存在一个变量中。一个元组是一个变量名,后面是两个小括号和逗号。Python 需要一个尾部的逗号来确定它是一个字符串。在变量名之后,一个元组可以用一对小括号和逗号分隔的对象来构造。
-
字典- 一个字典由未经排序的键/值对组成。可以有任何数量的键和值对。字典,像集合一样,缺乏顺序,并且在创建之后,它们可以被修改。值会溢出,如果字典包含多于一个项目,则只返回最近添加的值。
上述数据类型可以区分为可变、不可变、集合类型和映射。
现在让我们来比较和对比一下列表、图元和集合。
相同点
- 它们可以处理任何数据类型。
- 由于它们的灵活性,列表和集合在创建后可以被修改。
- 列表和图元都是有序的集合。
- 列表和图元可以共享项目。
不同之处
- 一个集合不能通过索引或键来引用,因为它是没有排序的,可以以任何顺序出现。
- 与列表和图元不同,集合只接受两个相同的项目中的一个。
- 图元是不可变的,这意味着它们在 Python 中形成后不能被修改。
集合模块
Pythoncollections 模块提供了一个替代 Python 内置容器数据类型的方法。collection 模块的具体数据结构在下面列出。
defaultdictOrderedDictnamedtuple()ChainMapdequeCounterUserDictUserList
让我们一个一个地看它们。
1. defaultdict
这是一个 dictionary 子类,它运行一个工厂函数来填补 dictionary 中的缺失值。当使用 dictionary 的缺失键值时,一般不会抛出问题。
下面的代码说明了defaultdict 模块。
from collections import defaultdict
integer = defaultdict(int)
integer['1'] = 33
integer['2'] = 44
print(integer['3'])
上面的代码输出0 ,因为它是默认的整数。
2.OrderedDict
字典的子类会跟踪它们被添加的顺序。逻辑上讲,即使你改变了一个键的值,它的位置也不会因为一系列的条目而改变。
下面的代码说明了OrderedDict 模块。
import collections
K = collections.OrderedDict()
K['Value1'] = 29
K['Value2'] = 30
K['Value3'] = 33
K['Value4'] = 44
for x,y in K.items():
print (x,y)
代码的输出将是。
Value1 29
Value2 30
Value3 33
Value4 44
3. namedtuple
这个函数将给元组中的每个值一个唯一的名字。它取消了对索引值的要求。使用namedtuple 检索这些值要容易得多,因为你不必记住索引值。
下面的代码说明了namedtuple() 函数。
import collections
Student = ('Leah', 19, 'F')
print(Student)
该代码的输出将是。
('Leah', 19, 'F')
4.链图
这是一个映射集合的词汇表,可以返回众多的字典。如果两个字典都有许多键值对,ChainMap将创建一个单一的列表。
5.deque
一个deque ,发音为 "deck",是一个列表,旨在使添加和删除项目变得简单。
下面的代码说明了deque 模块。
from collections import deque
list = ["a","b","c","d"]
letter = deque(list)
print(letter)
代码的输出将是。
deque(['a', 'b', 'c', 'd'])
6. counter
counter 是 dictionary 的一个子类,用于计算可散列的项目。
下面的代码说明了counter 模块。
from collections import Counter
K = Counter()
list = [1,2,3,4,5,7,8,5,9,6,10]
Counter(list)
Counter({1:5,2:4})
list = [1,2,4,7,5,1,6,7,6,9,1]
K = Counter(list)
print(K[1])
代码的输出将是:3 。
7.UserList
这个类包装了一个事物的列表。以这个类为基础,其他类似列表的类可以覆盖现有的方法或增加新的方法。
这个类的建立是为了从一个列表中进行子类化。底层的列表现在是一个类的属性,使其使用更简单。它是创建一个类似列表的对象的类。
当一个事件发生时,它被记录在一个标准列表中。在列表的子类所提供的构造函数上可以调用一个或多个争议。
8.UserDict
字典被包裹在这个类中。从dict 的子类需要创建这个类。字典现在是一个类的属性,使它更容易使用。
这个类的行为就像一个字典,玩起来很有意思。用户可以使用标准的字典,通过UserDict 类的数据字段来获得实例的数据。为了在其他方面加以利用,不保留原始数据。
Python集合模块的实现
集合模块可以用来。
- 通过使用
namedtuples(),提高代码的可读性。 - 队列和堆栈用于建立高效的队列和堆栈。
defaultdict模块用于处理丢失的键。- 使用
OrderedDict模块保持你的字典有序。 - 使用
counter模块同时对多个对象进行计数。 - 使用
UserString,UserList, 和UserDict模块定制内建模块。
让我们来看看其中的一个实现!
使用 defaultdict 模块处理丢失的键
Python 中的字典是将单个键映射到单个值的容器,其访问时间复杂度为 0(1)。
然而,在许多应用程序中,用户可能不熟悉所有的字典键。每当用户试图访问一个不可用的键时,就会显示一个错误信息。
缺少的键可以用defaultdict,get(), 和setdefault() 方法来处理。但是在这个例子中,我们将使用defaultdict 方法来处理丢失的键。
defaultdict 作为一个参数,期望有一个函数(默认工厂)作为其参数。默认工厂被设置为 ,也就是。0。如果 没有键,则返回默认工厂值。与 和 相比,它有以下优点。int defaultdict get() setdefault()
- 在声明时就设置了默认值。不需要用相同的参数调用函数,节省时间。
get()和 实现所需的时间比 。setdefaultdefaultdict()
import collections
value = collections.defaultdict(lambda : 'Key is missing')
value['x'] = 1
value['y'] = 2
print ("The monetary value attached to 'x' is : ",end="")
print (value['x'])
print ("The monetary value attached to 'k' is : ",end="")
print (value['k'])
输出结果将是。
The monetary value attached to 'x' is: 1
The monetary value attached to 'k' is: Key is missing.
从上面的代码中,我们声明了defaultdict 为值,其值为'key is missing' 字符串使用。
value = collections.defaultdict(lambda : 'Key is missing')
分别启动了x 和y的值。最后,我们打印了与x 和k 相关的值,其中x 是可用的,而k 是丢失的。
结论
collection 库是Python众多库中的一个,它主要作为集合数据类型中的一个高档菜单。我们已经详细了解了集合数据类型和模块,并且看到了如何实现集合模块来解决Python字典中的问题。