本文机器学习工程师GeorgeSeif介绍了Python集合模块的四种流行数据类型及其各自的使用方法。这些数据类型允许代码优化,从而使任务执行更加简洁。Python的最大优势之一是它有多种模块和包可供选择。这些模块和包将Python的强大功能扩展到许多热门领域,包括机器学习、数据科学、Web开发、前端等。表现最好的工具之一是Python的内置集合模块。一般来说,Python中的collections模块是一个存放列表、字典、元组、集合等数据集合的容器。这些容器嵌入在Python中,可以开箱即用。collections模块提供了额外的高性能数据类型,可以优化代码并使一些任务更加简洁。计数器官方文档:https://docs.python.org/2/library/collections.html#collections.CounterCounter是字典对象的子类。collections模块中的Counter()函数采用迭代器(例如列表或元组)并返回Counter字典。这个字典的键是这个迭代器中唯一的元素,每个键的值是迭代器元素的计数。首先,我们需要从collections包中导入Counter:fromcollectionsimportCounter如果我们想要创建一个Counter对象,我们必须像任何其他对象类一样将它分配给一个变量,传递给Counter对象的唯一变量是迭代器。lst=[1,2,3,3,2,1,1,1,2,2,3,1,2,1,1]counter=Counter(lst)如果我们使用简单的打印函数(print(counter))打印出这个Counter,你会得到一些类似于字典输出的东西:Counter({1:7,2:5,3:3})你可以使用这些键来访问任何Counter项目。这与从标准Python字典中获取元素完全相同。lst=[1,2,3,3,2,1,1,1,2,2,3,1,2,1,1]counter=Counter(lst)print(counter[1])most_common()函数到目前为止,Counter对象上最有用的函数是most_common()。当应用于Counter对象时,它返回一个列表,其中包含前N个最常见的元素及其计数,并按常见程度降序排序。lst=[1,2,3,3,2,1,1,1,2,2,3,1,2,1,1]counter=Counter(lst)print(counter.most_common(2))以上代码将打印以下元组的列表。[(1,7),(2,5)]每个元组的第一个元素是列表中的唯一项,第二个元素是计数值。对于诸如“获取列表中的前3个常见元素及其计数”之类的问题,这将是一种快速简便的方法。如果想了解更多Counter的功能,可以查看官方文档。defaultdict官方文档:https://docs.python.org/2/library/collections.html#collections.defaultdictdefaultdict的工作方式与普通的python字典完全一样,只是当您尝试访问不存在的键时,它不会报错,而是用默认值初始化key。默认值是根据在创建defaultdict对象时作为参数输入的数据类型自动设置的。下面的代码是一个例子。相反,它使用默认值初始化密钥。默认值是根据在创建defaultdict对象时作为参数输入的数据类型自动设置的。下面的代码是一个例子。fromcollectionsimportdefaultdictnames_dict=defaultdict(int)names_dict["Bob"]=1names_dict["Katie"]=2sara_number=names_dict["Sara"]print(names_dict)在上面的例子中,传递给defaultdict对象的默认值是int。然后每个键都有一个值,所以“Bob”和“Katie”各有一个数字。但在最后一行,我们尝试访问一个未定义的键,即“Sara”。在普通字典中,这个操作会报错。但是使用defaultdict会自动为“Sara”初始化一个新键,其值为0对应于我们的int数据类型。因此,最后一行可以打印出“Bob”、“Katie”和“Sara”以及对应的值。defaultdict(,{'Bob':1,'Katie':2,'Sara':0})如果我们改用list来初始化我们的defaultdict,即names_dict=defaultdict(list),那么“Sara”的值会被初始化为空列表[],打印出来的内容会变成:defaultdict(,{'Bob':1,'Katie':2,'Sara':[]})如果想了解更多defaultdict的功能,可以查看官方文档。Deque官方文档:https://docs.python.org/2/library/collections.html#collections.dequequeue是计算机科学中的一种基本数据架构,遵循先进先出(First-In-First-出,先进先出)原则。简单地说,第一个加入队列的对象也必须第一个被删除。我们只能在队列的前面插入内容,我们只能从后面删除内容-两者之间的任何内容都无法操作。collections库中的deque优化了这个功能。这种方法的一个关键特性是保持队列长度不变,即如果你将队列的最大大小设置为10,那么双端队列会按照先进先出的原则添加和删除元素,以保持队列的最大大小在10。这是迄今为止在Python中使用队列的最佳方式。让我们看另一个例子。我们首先创建一个双端队列对象,并用1到10之间的整数对其进行初始化。fromcollectionsimportdequemy_queue=deque(maxlen=10)foriinrange(10):my_queue.append(i+1)print(my_queue)在上面的代码中,我们首先初始化了deque,指定其最大长度为10。然后我们通过for循环向队列中插入值。请注意,这里我们以与普通Python列表相同的方式填充队列。最后,我们打印结果。deque([1,2,3,4,5,6,7,8,9,10],maxlen=10)因为我们的queue设置了maxlen=10,循环值增加了10个元素,所以这个queue包含所有从1到10的数字。现在让我们看看如果我们继续向它添加数字会发生什么。foriinrange(10,15):my_queue.append(i+1)print(my_queue)在上面的代码中,我们向队列中添加了5个元素-数字11到15。但是我们的队列只能有10个元素,所以它需要删除一些元素。因为队列必须遵守FIFO原则,所以它删除了插入队列的前5个元素,按照插入顺序为[1,2,3,4,5]。打印结果如下:deque([6,7,8,9,10,11,12,13,14,15],maxlen=10)想了解更多deque的功能可以查看官方文件。namedtuple官方文档:https://docs.python.org/2/library/collections.html#collections.namedtuple当你用python创建一个正则元组时,它的元素都是通用的,没有命名。这使得您有必要记住每个元组元素的确切索引。namedtuple可以解决这个问题。namedtuple()可以返回一个元组,元组中的每个位置都有一个固定的名字,namedtuple对象也有一个共同的名字。要使用namedtuple,您需要先为其创建一个模板。下面的代码创建了一个名为“Person”的命名元组模板,其属性为“name”、“age”和“job”。fromcollectionsimportnamedtuplePerson=namedtuple('Person','nameagejob')创建模板后,您可以使用它来创建namedtuple对象。让我们为2个人创建2命名元组并打印出他们的表示。Person=namedtuple('Person','nameagejob')Mike=Person(name='Mike',age=30,job'DataScientist')Kate=Person(name="Kate",age=28,job='ProjectManager')print(Mike)print(Kate)上面的代码很容易理解,我们为namedtuple初始化了一个“Person”模板,并初始化了它的所有属性。以上代码最终打印结果为:Person(name='Mike',age=30,job='DataScientist')Person(name='Kate',age=28,job='ProjectManager')因此,namedtuple使得tuple更易于使用,更具可读性和组织性。如果想详细了解namedtuple的功能,可以查看官方文档。