浅谈4个实用python内置数据结构的作用和用法
Admin 2021-06-02 群英技术资讯 500 次浏览
这篇文章给大家分享的是有关python内置数据结构的内容,下文介绍了array、defaultdict、Named Tuple和Counter这几种python内置数据结构的作用和用法,小编觉得挺实用的,因此分享给大家做个参考。感兴趣的朋友跟随小编一起来看看吧。
Python不仅仅可以使用内置的list实现数组,还支持像C语言那样的指定类型的原生数组array。
很显然,因为list可以存储各种类型的对象,而array只存储一个指定的原生类型,所以当数据量较大时,原生array在内存占用方面要比list小。而且array不像C语言里那样在定义时就限制了大小,它支持list所支持的各种常用函数。相比之下Python的array更像是C++的vector。
from array import array l = list(range(100)) a = array.fromlist(l) print(l.__sizeof__(), a.__sizeof__())
目前array有两个限制。首先,它只支持整数、小数、unicode字符,而不能像C++的vector那样支持多种数据类型。另外目前指定类型比较麻烦,我们需要使用类型对应的字母缩写来指定,而不能使用简单的诸如int,float的方式。
a = array('i') a.append(1) a.append(4)
Type code | C Type | Python Type | Minimum size in bytes |
'b' | signed char | int | 1 |
'B' | unsigned char | int | 1 |
'u' | wchar_t | Unicode character | 2 |
'h' | signed short | int | 2 |
'H' | unsigned short | int | 2 |
'i' | signed int | int | 2 |
'I' | unsigned int | int | 2 |
'l' | signed long | int | 4 |
'L' | unsigned long | int | 4 |
C++的map对于新的key会自动使用value type的默认构造函数构造一个值,而Python默认的dict对于不存在的key的访问会抛出异常(赋值除外)。这是因为Python不知道value的类型,所以没办法为我们默认构造。
defaultdict要求我们在构造时指定一个类型,然后会自动根据需要初始化value。这样我们就可以使用简单的代码来实现很多功能。
下面的代码,我对比了使用defaultdict和original dict实现将学生按照姓的首字母分组的功能,以及分类计数的功能。
import collections students = ['Zhang San', 'Li Si', 'Zhou liu', 'Chen qi', 'Cheng ba'] # using defaultdict dd = collections.defaultdict(list) for s in students: key = s[0] dd[key].append(s) print(dd) # using original dict (method 1) od = {} for s in students: key = s[0] if key not in do: od[key] = [] od[key].append(s) print(od) scores = ['A', 'B', 'C', 'A', 'A', 'B', 'C', 'B', 'A', 'A'] # using defaultdict dd = collections.defaultdict(int) for s in scores : dd[s] += 1 print(dd) # using original dict (method 2) od = collections.defaultdict(int) for s in scores : if s not in do: do[s] = 1 else: do[s] += 1 print(od)
编程实践中我们经常需要创建一些小的数据结构用来整合一组相关联的数据,简单的比如地理坐标的经纬度,颜色的RGB值或者矩形框的左上和右下坐标,复杂的比如构造一个窗口的一组参数。
实践中,我们通常有3中实现方法:
collections的nametuple可以为我们直接构造一个具有名字的简单类型,方便快捷地实现类似手写了一个class的效果。
需要注意的是collections.nametuple是一个factory function,它用来帮我们创建一个类型,而不是这个类型的具体对象。创建类型时,我们可以指定各个属性的名字,之后就可以使用.来访问了,而且它同时还支持使用下标访问。同时Named Tuple还支持_asdict函数用来将内部的数值转换成一个dict。
# class class Rect: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def area_class(r): w = r.x2 - r.x1 h = r.y2 - r.y1 return w*h r1 = Rect(1,3,5,5) # <__main__.Rect object at 0x7fde252a87f0> # to show its content, we need to implement __repr__(self) or __str__(self) print(area_class(r1)) # tuple def area_tuple(r): w = r[2]-r[0] h = r[3]-r[1] return w*h r2 = (1,3,5,5) print(r2) # (1, 3, 5, 5) print(area_tuple(r2)) # dict def area_dict(r): w = r["x2"] - r["x1"] h = r["y2"] - r["y1"] return w*h r3 = {"x1":1, "y1":3, "x2":5, "y2":5} print(r3) # {'x1': 1, 'y1': 3, 'x2': 5, 'y2': 5} print(area_tuple(r3)) # named tuple import collections Rectangle = collections.namedtuple("Rectangle", ["x1", "y1", "x2", "y2"]) def area_namedtuple(r): w = r.x2 - r.x1 y = r.y2 - r.y1 return w*h r4 = Rectangle(1,3,5,5) print(r4) # Rectangle(x1=1, y1=3, x2=5, y2=5) x1,y2,x2,y2 = r4 print(x1,y2,x2,y2) # 1 3 5 5 print(area_namedtuple(r4)) print(area_class(r4)) # work with "." grammar print(area_tuple(r4)) # work with index print(area_dict(r4._asdict())) # work with dict
顾名思义,Counter是用来对元素进行计数的,它也是collections这个包里的。根据Python的官方文档,它是dict类型的一个子类。
在构造的时候输入一个iterable的类型,比如list,range或是一个mapping的类型,比如dict,defaultdict。然后Counter就会对其中的元素进行计数。比较特殊的是,Counter对负数没有做特殊处理,就是说在特殊操作下允许出现测试为负,后面我们会有例子。
c = Counter() # a new, empty counter c = Counter('gallahad') # a new counter from an iterable print(c) # Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping print(c) # Counter({'red': 4, 'blue': 2}) c = Counter(cats=4, dogs=8) # a new counter from keyword args print(c) # Counter({'dogs': 8, 'cats': 4})
除了基本的计数功能,它还支持一些常用的相关功能。比如:
c = Counter(a=4, b=2, c=0, d=-2) sorted(c.elements()) # ['a', 'a', 'a', 'a', 'b', 'b'] Counter('abracadabra').most_common(3) # [('a', 5), ('b', 2), ('r', 2)] c1 = Counter(a=4, b=2, d=-2) c2 = Counter(a=1, b=2, c=3, d=4) c1.subtract(c2) c1 # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
关于array、defaultdict、Named Tuple和Counter这几种python内置数据结构的介绍就到这,想要了解更多更具体的介绍,可以浏览官方文档,希望本文能对大家有帮助。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了python使用OpenCV实现多目标跟踪,如何在OpenCV中使用MultiTracker类实现多目标跟踪API。在深入了解详细信息之前,请查看下面列出的关于目标跟踪的帖子,以了解在OpenCV中实现的单个目标跟踪器的基础知识,需要的朋友可以参考一下
django分页器怎么样使用?django自带的分页器是比较实用的,但是很多新手可能不太了解django分页器用法,下面小编就给大家简单的介绍一下django是实现分页以及分页器的用法,感兴趣的朋友就继续往下看吧。
这篇文章主要为大家详细介绍了Python3利用Qt5实现简易的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本篇文章给大家带来了关于Python的相关知识,每个 ndarray 都有一个关联的数据类型 (dtype) 对象。这个数据类型对象(dtype)告诉我们数组的布局。下面将通过示例详细讲讲NumPy的数据类型对象,需要的可以参考一下。
这篇文章主要介绍了python 教程实现 turtle绘制海龟绘图,文章基于python的相关资料展开turtle绘制海龟绘图的详细内容,需要的小伙伴可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008