了解Python中的集合

98 阅读7分钟

了解Python中的集合

在计算机编程中,一个集合是一组类似的数据类型。这些单元类可以协助组织和管理相关项目。

集合的特点是数据结构有助于有效地管理大量的数据。Python中的collection 模块提供了各种各样的容器。

容器可以存储各种项目,并且可以重新创建。这些容器包括图元、列表、字典,以及更多。

在这篇文章中,我们将探讨在collections 模块中发现的一些容器。

前提条件

要理解本文的内容,你应该具备以下条件。

  1. 对Python编程有一定的了解。
  2. 安装了Python。

集合数据类型

如前所述,集合数据类型可以用来存储一个项目的集合。这些类型是

  1. 列表- 迭代生成的列表可以通过添加或删除元素来修改。要创建一个列表,使用方括号[]

  2. 集合- 在无序的、不可改变的唯一项目的集合中不允许有重复。一个数据类型的集合可以用来执行数学运算,如相交、联合和对称差。可以使用变量名后面的大括号或set() 构造函数来创建集合。

  3. 元组- 它们是一个有序的、不可改变的多个事物的序列,保存在一个变量中。一个元组是一个变量名,后面是两个小括号和逗号。Python 需要一个尾部的逗号来确定它是一个字符串。在变量名之后,一个元组可以用一对小括号和逗号分隔的对象来构造。

  4. 字典- 一个字典由未经排序的键/值对组成。可以有任何数量的键和值对。字典,像集合一样,缺乏顺序,并且在创建之后,它们可以被修改。值会溢出,如果字典包含多于一个项目,则只返回最近添加的值。

上述数据类型可以区分为可变、不可变、集合类型和映射。

现在让我们来比较和对比一下列表、图元和集合。

相同点

  1. 它们可以处理任何数据类型。
  2. 由于它们的灵活性,列表和集合在创建后可以被修改。
  3. 列表和图元都是有序的集合。
  4. 列表和图元可以共享项目。

不同之处

  1. 一个集合不能通过索引或键来引用,因为它是没有排序的,可以以任何顺序出现。
  2. 与列表和图元不同,集合只接受两个相同的项目中的一个。
  3. 图元是不可变的,这意味着它们在 Python 中形成后不能被修改。

集合模块

Pythoncollections 模块提供了一个替代 Python 内置容器数据类型的方法。collection 模块的具体数据结构在下面列出。

  • defaultdict
  • OrderedDict
  • namedtuple()
  • ChainMap
  • deque
  • Counter
  • UserDict
  • UserList

让我们一个一个地看它们。

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集合模块的实现

集合模块可以用来。

  1. 通过使用namedtuples() ,提高代码的可读性。
  2. 队列和堆栈用于建立高效的队列和堆栈。
  3. defaultdict 模块用于处理丢失的键。
  4. 使用OrderedDict 模块保持你的字典有序。
  5. 使用counter 模块同时对多个对象进行计数。
  6. 使用UserString,UserList, 和UserDict 模块定制内建模块。

让我们来看看其中的一个实现!

使用 defaultdict 模块处理丢失的键

Python 中的字典是将单个键映射到单个值的容器,其访问时间复杂度为 0(1)。

然而,在许多应用程序中,用户可能不熟悉所有的字典键。每当用户试图访问一个不可用的键时,就会显示一个错误信息。

缺少的键可以用defaultdict,get(), 和setdefault() 方法来处理。但是在这个例子中,我们将使用defaultdict 方法来处理丢失的键。

defaultdict 作为一个参数,期望有一个函数(默认工厂)作为其参数。默认工厂被设置为 ,也就是。0。如果 没有键,则返回默认工厂值。与 和 相比,它有以下优点。int defaultdict get() setdefault()

  1. 在声明时就设置了默认值。不需要用相同的参数调用函数,节省时间。
  2. get() 和 实现所需的时间比 。setdefault defaultdict()
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的值。最后,我们打印了与xk 相关的值,其中x 是可用的,而k 是丢失的。

结论

collection 库是Python众多库中的一个,它主要作为集合数据类型中的一个高档菜单。我们已经详细了解了集合数据类型和模块,并且看到了如何实现集合模块来解决Python字典中的问题。