-
成员测试是程序设计的重点,有效输入值的集合就是一个示例。当用户输入集合中的 内容时,其输入有效或者无效。
简单的成员测试建议使用集(set)。
valid_input={"yes","y","no","n"}
answer=None
while 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。集的内容不可更改。
注意,集中元素的顺序并不完全是我们刚开始提供的顺序。集不能对元素保持任何特定的顺序,它只能确定集中是否存在某个元素。
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颜色有三个值,那么就可能需要使用元组而不是列表。如果元素的数量会增长和变化,那么列表是比元组更好的选择。
scheme={"Crimson":(220,14,60),
"DarkCyan",(0,139,139),
"Yellow":(255,255,00)}
scheme['Crimson']
(220,14,60)
我们在字典scheme中添加了从颜色名称到RGB颜色元组的映射。当使用一个键时,例如“Crimson”,可以检索绑定到该键的值。
我们可以将每个列表转换为元组,而不是创建一个以列表为元素的集。我们可以创建以不可变的元组为元素的集。
类似的,字典的键也必须是不可变的。可以使用数字、字符串或元组作为字典的键,不可以使用列表、集或者其他可变的映射作为字典的集。
Python的每种内置集合都提供了一组独特的功能。这些集合还提供了大量重叠的功能,对于Python新手来说是一个挑战。
实际上,collections.abc模块通过内置集合提供了一种指南。collections.abc模块定义了支持具体类的抽象基类(abstract base class,ABC)。我们将通过这组定义中的名称来了解这些结构的功能。
根据抽象基类可以将集合分为6类。
-
可变集:set集合。 -
不可变集:frozenset集合。
-
可变序列:list集合。 -
不可变序列:tuple集合。
-
可变映射:dict集合。 -
不可变映射:没有内置的冻结映射。
Python的库提供了这些核心集合类型的大量附加实现。
-
namedetuple:元组。可以为元组中的每个元素提供名称。使用rgb_color.red要比rgb_color[0]稍微清晰。 -
deque:双端队列。这是一种可变序列,增加了从每一端推入和弹出的优化。列表可实现相似的功能,但是deque的效率更高。 -
defaultdict:字典。可以为缺失键提供默认值。 -
Counter:字典。可用于计算键出现的次数。有时也叫作多重集(multiset)或包(bag)。 -
OrdereDict:字典。保留键创建时的顺序。 -
ChainMap:字典。将多个字典组合为单个映射。
-
数组(array):Python的列表结构是典型的数组,并提供与数组的链表类似的性能。 -
树(tree):树结构可用于创建集、顺序列表或键值映射,可以将树视为一种实现技术,而不是具有独特功能集的数据结构。 -
散列(hash):Python使用散列来实现字典和集,虽然速度快,但内存消耗大。 -
图(graph):Python没有内置的图数据结构。但是可以轻松地用字典表示图结构,其中每个节点都有相邻节点的列表。
文章评论