Python--选择合适的数据结构来处理数据集合

2022年8月6日 360点热度 0人点赞 0条评论
Python拥有丰富的内置数据结构,很多应用程序都是由内置数据结构构建的。这些集合覆盖了各种情况。内置的元组结构和字符串结构不同于列表结构。他们之间有一些重要的相似之处,但是也有一些差异。这些内置的数据结构可以帮我们处理数据集合。我们很难确定哪种数据结构适合于某种场景。

如何选择使用哪种结构?列表、集合和字典的功能是什么?为什么会出现元组和冻结集合?


  1. 成员测试是程序设计的重点,有效输入值的集合就是一个示例。当用户输入集合中的 内容时,其输入有效或者无效。 

简单的成员测试建议使用集(set)。

valid_input={"yes","y","no","n"}answer=Nonewhile answer not in valid_inputs:    answer=input("Continue? [y,n]").lower()

集在没有特定顺序的状态下保持元素不变。如果元素是集的成员,那么就不能再向集中添加该元素。

valid_inputs={"yes","y","no","n"}valid_inputs.add("y")valid_inputs{'no','y','n','yes'}

我们创建了一个具有4各不同字符串的集——valid_inputs。不能再向已经含有y的集中添加另外一个y。集的内容不可更改。

注意,集中元素的顺序并不完全是我们刚开始提供的顺序。集不能对元素保持任何特定的顺序,它只能确定集中是否存在某个元素。


2.是否可以根据元素在集合中的位置来表示它们?输入文件中的行就是一个相关示例,行号就是行在集合中的位置。
当必须使用索引或者位置来识别元素时,必须使用列表(list)。
month_name_list=["jan","Feb","Mar","Apr",    "May","Jun","Jul","Aug",    "Sep","Oct","Nov","Dec"]month_name_list[8]"sep"month_name_list.index("Feb")1

我们创建了一个具有12个字符串元素的列表——month_name_list。可以通过提供其位置来选择一个元素,还可以使用index()方法来查找元素在列表中的索引。

Python中列表的位置始终从0开始,对于元组和字符串也是如此。

如果集合中的元素数量是固定的,例如,RGB颜色有三个值,那么就可能需要使用元组而不是列表。如果元素的数量会增长和变化,那么列表是比元组更好的选择。


3.是否可以用元素的键而不是位置来标识集合中的元素?示例可能包括字符串(即单词)与表示这些单词频率的整数之间的映射,也可能是颜色名称和该颜色的RGB元组之间的映射。
当必须使用非位置键来识别元素时,建议使用某种映射。内置的映射就是字典(dict)。可以通过扩展添加更多的特性。
scheme={"Crimson":(220,14,60),"DarkCyan",(0,139,139),"Yellow":(255,255,00)}scheme['Crimson'](220,14,60)

我们在字典scheme中添加了从颜色名称到RGB颜色元组的映射。当使用一个键时,例如“Crimson”,可以检索绑定到该键的值。

4.仔细考虑集中的元素以及字典中键的可变性。集中的每个元素必须是不可变的对象。数字、字符串和元组都是不可变的,它们可以被收集到集中。由于列表、字典或集是可变的,因此它们不能被用作集的元素。例如,不可能构建一个以列表为元素的集。

我们可以将每个列表转换为元组,而不是创建一个以列表为元素的集。我们可以创建以不可变的元组为元素的集。

类似的,字典的键也必须是不可变的。可以使用数字、字符串或元组作为字典的键,不可以使用列表、集或者其他可变的映射作为字典的集。

Python的每种内置集合都提供了一组独特的功能。这些集合还提供了大量重叠的功能,对于Python新手来说是一个挑战。

实际上,collections.abc模块通过内置集合提供了一种指南。collections.abc模块定义了支持具体类的抽象基类(abstract base class,ABC)。我们将通过这组定义中的名称来了解这些结构的功能。

根据抽象基类可以将集合分为6类。

集:独特的功能是元素成员测试。集不能保持重复的元素。
  • 可变集:set集合。
  • 不可变集:frozenset集合。
序列:独特的功能是为元素提供索引位置。
  • 可变序列:list集合。
  • 不可变序列:tuple集合。
映射:独特的功能是每个元素都有一个指向一个值的键。
  • 可变映射:dict集合。
  • 不可变映射:没有内置的冻结映射。

Python的库提供了这些核心集合类型的大量附加实现。


collections模块包含内置集合的许多变体。
  • namedetuple:元组。可以为元组中的每个元素提供名称。使用rgb_color.red要比rgb_color[0]稍微清晰。
  • deque:双端队列。这是一种可变序列,增加了从每一端推入和弹出的优化。列表可实现相似的功能,但是deque的效率更高。
  • defaultdict:字典。可以为缺失键提供默认值。
  • Counter:字典。可用于计算键出现的次数。有时也叫作多重集(multiset)或包(bag)。
  • OrdereDict:字典。保留键创建时的顺序。
  • ChainMap:字典。将多个字典组合为单个映射。
Python标准库中还有更多类似的结构。我们可以使用heapq模块定义优先级队列。bisect模块包含非常快速地搜索排序列表的方法,可以使用列表具有更接近字典快速查找的性能。
  • 数组(array):Python的列表结构是典型的数组,并提供与数组的链表类似的性能。
  • 树(tree):树结构可用于创建集、顺序列表或键值映射,可以将树视为一种实现技术,而不是具有独特功能集的数据结构。
  • 散列(hash):Python使用散列来实现字典和集,虽然速度快,但内存消耗大。
  • 图(graph):Python没有内置的图数据结构。但是可以轻松地用字典表示图结构,其中每个节点都有相邻节点的列表。
在Python中几乎可以实现任何类型的数据结构,要么内置结构具有相应的本质特征,要么可以找到一个面前能够使用的内置结构。

78400Python--选择合适的数据结构来处理数据集合

这个人很懒,什么都没留下

文章评论