面向对象的 Python - 数据结构
从语法的角度来看,Python 数据结构非常直观,并且提供了大量的操作选择。您需要根据数据涉及的内容、是否需要修改、是否是固定数据以及需要什么访问类型(例如开头/结尾/随机等)来选择 Python 数据结构。
列表
列表代表 Python 中最通用的数据结构类型。列表是一个容器,它在方括号之间保存逗号分隔的值(项目或元素)。当我们想要处理多个相关值时,列表很有用。由于列表将数据保存在一起,我们可以同时对多个值执行相同的方法和操作。列表索引从零开始,与字符串不同,列表是可变的。
数据结构 - 列表
>>> >>> # Any Empty List >>> empty_list = [] >>> >>> # A list of String >>> str_list = ['Life', 'Is', 'Beautiful'] >>> # A list of Integers >>> int_list = [1, 4, 5, 9, 18] >>> >>> #Mixed items list >>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list'] >>> # To print the list >>> >>> print(empty_list) [] >>> print(str_list) ['Life', 'Is', 'Beautiful'] >>> print(type(str_list)) <class 'list'> >>> print(int_list) [1, 4, 5, 9, 18] >>> print(mixed_list) ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
访问 Python 列表中的项目
列表中的每个项目都分配有一个数字 - 即该数字的索引或位置。索引始终从零开始,第二个索引为 1,依此类推。要访问列表中的项目,我们可以在方括号内使用这些索引号。例如,请观察以下代码 −
>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list'] >>> >>> # To access the First Item of the list >>> mixed_list[0] 'This' >>> # To access the 4th item >>> mixed_list[3] 18 >>> # To access the last item of the list >>> mixed_list[-1] 'list'
空对象
空对象是最简单、最基本的 Python 内置类型。我们多次使用它们却没有注意到,并且已经将其扩展到我们创建的每个类中。编写空类的主要目的是暂时阻止某些事情,然后对其进行扩展并为其添加行为。
向类添加行为意味着用对象替换数据结构并更改对它的所有引用。因此,在创建任何内容之前,检查数据是否是伪装的对象非常重要。请观察以下代码以更好地理解:
>>> #Empty objects >>> >>> obj = object() >>> obj.x = 9 Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> obj.x = 9 AttributeError: 'object' object has no attribute 'x'
因此,从上面可以看出,无法在直接实例化的对象上设置任何属性。当 Python 允许对象具有任意属性时,它会占用一定数量的系统内存来跟踪每个对象具有的属性,用于存储属性名称及其值。即使没有存储任何属性,也会为潜在的新属性分配一定数量的内存。
因此,默认情况下,Python 会禁用对象和其他几个内置函数的任意属性。
>>> # Empty Objects >>> >>> class EmpObject: pass >>> obj = EmpObject() >>> obj.x = 'Hello, World!' >>> obj.x 'Hello, World!'
因此,如果我们想将属性组合在一起,我们可以将它们存储在一个空对象中,如上面的代码所示。但是,这种方法并不总是建议的。请记住,只有当您想要同时指定数据和行为时,才应使用类和对象。
元组
元组类似于列表,可以存储元素。但是,它们是不可变的,所以我们不能添加、删除或替换对象。由于元组的不可变性,它提供的主要好处是,我们可以将它们用作字典中的键,或者在对象需要哈希值的其他位置使用它们。
元组用于存储数据,而不是行为。如果您需要行为来操作元组,则需要将元组传递给执行该操作的函数(或另一个对象上的方法)。
由于元组可以充当字典键,因此存储的值彼此不同。我们可以通过用逗号分隔值来创建元组。元组用括号括起来,但不是强制性的。以下代码显示了两个相同的赋值。
>>> stock1 = 'MSFT', 95.00, 97.45, 92.45 >>> stock2 = ('MSFT', 95.00, 97.45, 92.45) >>> type (stock1) <class 'tuple'> >>> type(stock2) <class 'tuple'> >>> stock1 == stock2 True >>>
定义元组
元组与列表非常相似,只是整个元素集用圆括号而不是方括号括起来。
就像切片列表时会得到一个新列表一样,切片元组时也会得到一个新元组。
>>> tupl = ('Tuple','is', 'an','IMMUTABLE', 'list') >>> tupl ('Tuple', 'is', 'an', 'IMMUTABLE', 'list') >>> tupl[0] 'Tuple' >>> tupl[-1] 'list' >>> tupl[1:3] ('is', 'an')
Python 元组方法
以下代码展示了 Python 元组中的方法 −
>>> tupl ('Tuple', 'is', 'an', 'IMMUTABLE', 'list') >>> tupl.append('new') Traceback (most recent call last): File "<pyshell#148>", line 1, in <module> tupl.append('new') AttributeError: 'tuple' object has no attribute 'append' >>> tupl.remove('is') Traceback (most recent call last): File "<pyshell#149>", line 1, in <module> tupl.remove('is') AttributeError: 'tuple' object has no attribute 'remove' >>> tupl.index('list') 4 >>> tupl.index('new') Traceback (most recent call last): File "<pyshell#151>", line 1, in <module> tupl.index('new') ValueError: tuple.index(x): x not in tuple >>> "is" in tupl True >>> tupl.count('is') 1
从上面的代码中,我们可以理解元组是不可变的,因此 −
您不能向元组添加元素。
您不能附加或扩展方法。
您不能从元组中删除元素。
元组没有删除或弹出方法。
计数和索引是元组中可用的方法。
字典
字典是 Python 的内置数据类型之一,它定义了键和值之间的一对一关系。
定义字典
观察以下代码以了解如何定义一个字典 −
>>> # empty dictionary >>> my_dict = {} >>> >>> # dictionary with integer keys >>> my_dict = { 1:'msft', 2: 'IT'} >>> >>> # dictionary with mixed keys >>> my_dict = {'name': 'Aarav', 1: [ 2, 4, 10]} >>> >>> # using built-in function dict() >>> my_dict = dict({1:'msft', 2:'IT'}) >>> >>> # From sequence having each item as a pair >>> my_dict = dict([(1,'msft'), (2,'IT')]) >>> >>> # Accessing elements of a dictionary >>> my_dict[1] 'msft' >>> my_dict[2] 'IT' >>> my_dict['IT'] Traceback (most recent call last): File "<pyshell#177>", line 1, in <module> my_dict['IT'] KeyError: 'IT' >>>
从上面的代码中我们可以观察到:
首先,我们创建一个包含两个元素的字典,并将其分配给变量 my_dict。每个元素都是一个键值对,整个元素集都括在花括号中。
数字 1 是键,msft 是其值。同样,2 是键,IT 是其值。
您可以通过键获取值,但反之则不行。因此,当我们尝试 my_dict['IT'] 时,它会引发异常,因为 IT 不是键。
修改字典
观察以下代码以了解如何修改字典 −
>>> # Modifying a Dictionary >>> >>> my_dict {1: 'msft', 2: 'IT'} >>> my_dict[2] = 'Software' >>> my_dict {1: 'msft', 2: 'Software'} >>> >>> my_dict[3] = 'Microsoft Technologies' >>> my_dict {1: 'msft', 2: 'Software', 3: 'Microsoft Technologies'}
从上面的代码中我们可以看出 −
字典中不能有重复的键。更改现有键的值将删除旧值。
您可以随时添加新的键值对。
字典中没有元素之间顺序的概念。它们是简单的无序集合。
在字典中混合数据类型
观察以下代码以了解如何在字典中混合数据类型 −
>>> # Mixing Data Types in a Dictionary >>> >>> my_dict {1: 'msft', 2: 'Software', 3: 'Microsoft Technologies'} >>> my_dict[4] = 'Operating System' >>> my_dict {1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System'} >>> my_dict['Bill Gates'] = 'Owner' >>> my_dict {1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System', 'Bill Gates': 'Owner'}
从上面的代码中我们可以看出 −
字典值不仅是字符串,还可以是任何数据类型,包括字符串、整数,甚至字典本身。
与字典值不同,字典键受到更多限制,但可以是任何类型,如字符串、整数或其他类型。
从字典中删除项目
观察以下代码以了解如何从字典中删除项目 −
>>> # Deleting Items from a Dictionary >>> >>> my_dict {1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System', 'Bill Gates': 'Owner'} >>> >>> del my_dict['Bill Gates'] >>> my_dict {1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System'} >>> >>> my_dict.clear() >>> my_dict {}
从上面的代码中我们可以看出 −
del − 允许您按键从字典中删除单个项目。
clear − 删除字典中的所有项目。
集合
Set() 是一个无序集合,没有重复元素。虽然单个项目是不可变的,但集合本身是可变的,也就是说我们可以从集合中添加或删除元素/项目。我们可以使用集合执行数学运算,如并集、交集等。
虽然集合通常可以使用树来实现,但 Python 中的集合可以使用哈希表来实现。这使得它能够以高度优化的方式检查特定元素是否包含在集合中
创建集合
通过将所有项目(元素)放在花括号{内并以逗号分隔或使用内置函数set()来创建集合。请观察以下代码行 −
>>> #set of integers >>> my_set = {1,2,4,8} >>> print(my_set) {8, 1, 2, 4} >>> >>> #set of mixed datatypes >>> my_set = {1.0, "Hello World!", (2, 4, 6)} >>> print(my_set) {1.0, (2, 4, 6), 'Hello World!'} >>>
集合的方法
观察以下代码以了解集合的方法 −
>>> >>> #METHODS FOR SETS >>> >>> #add(x) Method >>> topics = {'Python', 'Java', 'C#'} >>> topics.add('C++') >>> topics {'C#', 'C++', 'Java', 'Python'} >>> >>> #union(s) Method, returns a union of two set. >>> topics {'C#', 'C++', 'Java', 'Python'} >>> team = {'Developer', 'Content Writer', 'Editor','Tester'} >>> group = topics.union(team) >>> group {'Tester', 'C#', 'Python', 'Editor', 'Developer', 'C++', 'Java', 'Content Writer'} >>> # intersets(s) method, returns an intersection of two sets >>> inters = topics.intersection(team) >>> inters set() >>> >>> # difference(s) Method, returns a set containing all the elements of invoking set but not of the second set. >>> >>> safe = topics.difference(team) >>> safe {'Python', 'C++', 'Java', 'C#'} >>> >>> diff = topics.difference(group) >>> diff set() >>> #clear() Method, Empties the whole set. >>> group.clear() >>> group set() >>>
集合运算符
观察以下代码以了解集合运算符 −
>>> # PYTHON SET OPERATIONS >>> >>> #Creating two sets >>> set1 = set() >>> set2 = set() >>> >>> # Adding elements to set >>> for i in range(1,5): set1.add(i) >>> for j in range(4,9): set2.add(j) >>> set1 {1, 2, 3, 4} >>> set2 {4, 5, 6, 7, 8} >>> >>> #Union of set1 and set2 >>> set3 = set1 | set2 # same as set1.union(set2) >>> print('Union of set1 & set2: set3 = ', set3) Union of set1 & set2: set3 = {1, 2, 3, 4, 5, 6, 7, 8} >>> >>> #Intersection of set1 & set2 >>> set4 = set1 & set2 # same as set1.intersection(set2) >>> print('Intersection of set1 and set2: set4 = ', set4) Intersection of set1 and set2: set4 = {4} >>> >>> # Checking relation between set3 and set4 >>> if set3 > set4: # set3.issuperset(set4) print('Set3 is superset of set4') elif set3 < set4: #set3.issubset(set4) print('Set3 is subset of set4') else: #set3 == set4 print('Set 3 is same as set4') Set3 is superset of set4 >>> >>> # Difference between set3 and set4 >>> set5 = set3 - set4 >>> print('Elements in set3 and not in set4: set5 = ', set5) Elements in set3 and not in set4: set5 = {1, 2, 3, 5, 6, 7, 8} >>> >>> # Check if set4 and set5 are disjoint sets >>> if set4.isdisjoint(set5): print('Set4 and set5 have nothing in common ') Set4 and set5 have nothing in common >>> # Removing all the values of set5 >>> set5.clear() >>> set5 set()