Python中的数据结构,你全知道吗?

微信公众号-IT赶路人,专注分享与IT相关知识,关注我,一起升职加薪!

image.png

Python已经在全球范围内被用于不同的领域,如制作网站、人工智能和更多领域。但要使所有这些成为可能,数据扮演着非常重要的角色,这意味着这些数据应该被有效地存储,并且必须及时访问。那么你是如何做到这一点的呢?我们使用一种叫做数据结构的东西。话虽如此,让我们来了解一下我们将在Python中介绍的数据结构主题。

图片

什么是数据结构?

组织、管理和存储数据很重要,因为它使访问更容易,修改更有效。数据结构允许您以这样一种方式组织数据,使您能够存储数据集合、关联它们并相应地对它们执行操作。

Python中的数据结构类型

Python隐含地支持数据结构,使您能够存储和访问数据。这些结构称为列表、字典、元组和集合。Python允许用户创建他们自己的数据结构,使他们能够完全控制自己的功能。最突出的数据结构有Stack、Queue、Tree、Linked List等等,您也可以在其他编程语言中使用它们。既然您已经了解了可用的类型,为什么我们不前进到数据结构并使用Python实现它们呢?

图片

内置数据结构

顾名思义,这些数据结构内置在Python中,这使得编程变得更容易,并帮助程序员更快地使用它们来获得解决方案。让我们逐一详细讨论一下。

列表

列表用于以顺序方式存储不同数据类型的数据。列表中的每个元素都分配了地址,称为索引。索引值从0开始,一直持续到最后一个称为正索引的元素。还有负索引,它从-1开始,使您可以从最后一个到第一个访问元素。现在让我们借助一个示例程序更好地理解列表。

创建列表

要创建列表,请使用方括号并相应地向其中添加元素。如果您没有在方括号内传递任何元素,您将得到一个空列表作为输出。

my_list = [] #create empty list
print(my_list)
my_list = [1, 2, 3, 'example', 3.132] #creating list with data
print(my_list)

添加元素

可以使用Append()、Extended()和Insert()函数在列表中添加元素。

  • append()函数将传递给它的所有元素作为单个元素添加。

  • EXTEND()函数将元素逐个添加到列表中。

  • INSERT()函数将传递给索引值的元素相加,并增加列表的大小。

my_list = [1, 2, 3]
print(my_list)
my_list.append([555, 12]) #add as a single element
print(my_list)
my_list.extend([234, 'more_example']) #add as different elements
print(my_list)
my_list.insert(1, 'insert_example') #add element i
print(my_list)

删除元素
  • 要删除元素,请使用Python中内置的del关键字,但这不会向我们返回任何内容。

  • 如果您想要回元素,可以使用POP()函数,该函数接受索引值。

  • 要按元素的值删除元素,请使用Remove()函数。

my_list = [1, 2, 3, 'example', 3.132, 10, 30]
del my_list[5] #delete element at index 5
print(my_list)
my_list.remove('example') #remove element with value
print(my_list)
a = my_list.pop(1) #pop element from list
print('Popped Element: ', a, ' List remaining: ', my_list)
my_list.clear() #empty the list
print(my_list)

访问元素

访问元素与访问Python中的字符串相同。您传递索引值,因此可以根据需要获取值。

my_list = [1, 2, 3, 'example', 3.132, 10, 30]
for element in my_list: #access elements one by one
print(element)
print(my_list) #access all elements
print(my_list[3]) #access index 3 element
print(my_list[0:2]) #access elements from 0 to 1 and exclude 2
print(my_list[::-1]) #access elements in reverse

其他功能

在处理列表时,您还可以使用其他几个函数。

  • len()函数向我们返回列表的长度。

  • index()函数查找第一次遇到时传递的值的索引值。

  • count()函数查找传递给它的值的计数。

  • sorted()和sort()函数执行相同的操作,即对列表的值进行排序。排序后的()具有返回类型,而排序()修改原始列表。

my_list = [1, 2, 3, 10, 30, 10]
print(len(my_list)) #find length of list
print(my_list.index(10)) #find index of element that occurs first
print(my_list.count(10)) #find count of the element
print(sorted(my_list)) #print sorted list but not change original
my_list.sort(reverse=True) #sort original list
print(my_list)

输出:

6
3
2
[1, 2, 3, 10, 10, 30]
[30, 10, 10, 3, 2, 1]

字典

字典用于存储键-值对。为了更好地理解,想一想一个电话局,那里添加了成百上千个名字和相应的号码。现在这里的常量值是姓名和电话号码,它们被称为键。各种名字和电话号码就是输入到钥匙上的值。如果您访问密钥的值,您将获得所有的姓名和电话号码。这就是键-值对的含义。在Python中,此结构使用字典存储。让我们通过一个示例程序更好地理解这一点。

创建字典

可以使用花括号或使用dict()函数创建字典。无论何时使用字典,都需要添加键-值对。

my_dict = {} #empty dictionary
print(my_dict)
my_dict = {1: 'Python', 2: 'Java'} #dictionary with elements
print(my_dict)

输出:

{}
{1:‘Python’,2:‘Java’}

更改和添加键、值对

要更改字典的值,需要使用键。因此,您首先访问键,然后相应地更改值。要添加值,只需添加另一个键-值对,如下所示。

my_dict = {'First': 'Python', 'Second': 'Java'}
print(my_dict)
my_dict['Second'] = 'C++' #changing element
print(my_dict)
my_dict['Third'] = 'Ruby' #adding key-value pair
print(my_dict)

输出:

{‘First’:‘Python’,‘Second’:‘Java’}{‘First’:‘Python’,‘Second’:‘C++’}{‘First’:‘Python’,‘Second’:‘C++’,‘Third’:‘Ruby’}

删除键、值对

  • 要删除值,请使用POP()函数,该函数返回已删除的值。

  • 要检索键-值对,请使用popitem()函数,该函数返回键和值的元组。

  • 要清除整个字典,请使用Clear()函数。

my_dict = {'First': 'Python', 'Second': 'Java', 'Third': 'Ruby'}
a = my_dict.pop('Third') #pop element
print('Value:', a)
print('Dictionary:', my_dict)
b = my_dict.popitem() #pop the key-value pair
print('Key, value pair:', b)
print('Dictionary', my_dict)
my_dict.clear() #empty dictionary
print('n', my_dict)

输出:

值:RubyDictionary:{‘First’:‘Python’,‘Second’:‘Java’}
键值对:(‘Second’,‘Java’)
字典{‘First’:‘Python’}{}

访问元素

只能使用键访问元素。您可以使用get()函数,也可以只传递键值,这样就可以检索值。

my_dict = {'First': 'Python', 'Second': 'Java'}
print(my_dict['First']) #access elements using keys
print(my_dict.get('Second'))

输出:

Python
Java

其他功能

您有不同的函数,它们相应地将键-值对的键或值返回给我们,而键()、值()、项()函数则相应地返回给我们。

my_dict = {'First': 'Python', 'Second': 'Java', 'Third': 'Ruby'}
print(my_dict.keys()) #get keys
print(my_dict.values()) #get values
print(my_dict.items()) #get key-value pairs
print(my_dict.get('First'))

输出:

DICT_KEYS([‘First’,‘Second’,‘Third’])
DICT_VALUES([‘Python’,‘Java’,‘Ruby’])
DICT_ITEMS([(‘First’,‘Python’),(‘Second’,‘Java’),(‘Third’,‘Ruby’)])

Python

元组

元组与列表相同,不同之处在于数据一旦进入元组,无论如何都不能更改。唯一的例外是,当元组中的数据是可变的时,只有在那时元组数据才可以更改。示例程序将帮助您更好地理解。

创建元组

您可以使用括号或使用tuple()函数创建元组。

my_tuple = (1, 2, 3) #create tuple
print(my_tuple)

输出:

(1,2,3)

访问元素

访问元素与访问列表中的值相同。

my_tuple2 = (1, 2, 3, 'python') #access elements
for x in my_tuple2:
print(x)
print(my_tuple2)
print(my_tuple2[0])
print(my_tuple2[:])
print(my_tuple2[3][4])

输出:

123
python(1,2,3,‘python’)
1
(1,2,3,‘python’)
p

追加元素

要附加值,您可以使用‘+’运算符,该运算符将接受另一个要附加到它的元组。

my_tuple = (1, 2, 3)
my_tuple = my_tuple + (4, 5, 6) #add elements
print(my_tuple)

输出:

(1,2,3,4,5,6)

其他功能

这些函数与用于列表的函数相同。

my_tuple = (1, 2, 3, ['hindi', 'python'])
my_tuple[3][0] = 'english'
print(my_tuple)
print(my_tuple.count(2))
print(my_tuple.index(['english', 'python']))

输出:

(1,2,3,[‘English’,‘python’])
1
3

集合

集合是唯一的无序元素的集合。这意味着即使数据重复多次,也只会输入到集合中一次。它和你在算术中学过的集合很相似。运算也与算术集相同。示例程序将帮助您更好地理解。

创建集合

集是使用花括号创建的,但是您只需将值传递给它,而不是添加键值对。

my_set = {1, 2, 3, 4, 5, 5, 5} #create set
print(my_set)

输出:

{1,2,3,4,5}

添加元素

要添加元素,请使用add()函数并将值传递给它。

my_set = {1, 2, 3}
my_set.add(4) #add element to set
print(my_set)

输出:

{1,2,3,4}

集合操作

集合上的不同运算,如并集、交集等如下所示。

my_set = {1, 2, 3, 4}
my_set_2 = {3, 4, 5, 6}
print(my_set.union(my_set_2), '----------', my_set | my_set_2)
print(my_set.intersection(my_set_2), '----------', my_set & my_set_2)
print(my_set.difference(my_set_2), '----------', my_set - my_set_2)
print(my_set.symmetric_difference(my_set_2), '----------', my_set ^ my_set_2)
my_set.clear()
print(my_set)

  • UNION()函数将两个集合中存在的数据组合在一起。

  • INTERSION()函数仅查找两个集合中存在的数据。

  • Difference()函数删除两者中存在的数据,并输出仅存在于传递的集合中的数据。

  • SYMMPLICAL_DISTIAL()函数的作用与Difference()函数相同,但输出保留在两个集合中的数据。

输出:

{1,2,3,4,5,6}-{1,2,3,4,4,5,6}{3,4}-{3,4}{1,2}{1,2,5,6}-{1,2,5,6}

set()既然您已经了解了内置数据结构,我们就开始学习用户定义的数据结构。对于用户定义的数据结构,名称本身暗示用户定义数据结构的工作方式并定义其中的功能。这使用户可以完全控制数据需要如何保存、操作等。

自定义数据结构

数组与列表

数组和列表是相同的结构,只是有一点不同。列出异构数据元素存储,而数组只允许在其中存储同构数据元素。

堆栈

堆栈是基于后进先出(LIFO)原则的线性数据结构,其中最后输入的数据将首先被访问。它是使用数组结构构建的,具有推送(添加)元素、弹出(删除)元素和仅从堆栈中称为顶部的一点访问元素的操作。此顶部是指向堆栈当前位置的指针。堆栈主要用于递归编程、反转字、字编辑器中的撤消机制等应用程序中。

图片

队列

队列也是基于先进先出(FIFO)原则的线性数据结构,其中首先输入的数据将首先被访问。它是使用数组结构构建的,并且具有可以从队列的两端执行的操作,即头-尾或前-后。诸如添加和删除元素的操作称为入队和出队,并且可以执行对元素的访问。队列用作流量拥塞管理的网络缓冲区,用于作业调度等操作系统。

图片

树是具有根和节点的非线性数据结构。根是数据来源的节点,节点是我们可用的其他数据点。前面的节点是父节点,后面的节点称为子节点。一棵树必须有不同的层次来显示信息的深度。最后的节点称为叶子。树创建了一个层次结构,可以用于许多现实世界的应用程序中,比如超文本标记语言页面。使用树来区分哪个标签属于哪个挡路。它在搜索目的等方面也很有效。

图片

链表

链表是一种线性数据结构,因此不会存储,但使用指针彼此链接。链表的节点由数据和称为NEXT的指针组成。这些结构最广泛地用于图像观看应用、音乐播放器应用等。

图片

图表

图用于存储称为顶点(节点)和边(边)的点的数据集合。图形堪称是现实世界地图最准确的表现形式。它们被用来找出被称为节点的各种数据点之间的各种成本距离,从而找到最少的路径。许多应用程序,如谷歌地图、优步等,都使用图形来找到最短的距离,并以最好的方式增加利润。

图片

HashMaps

HashMap与Python中的字典相同。它们可以用来实现诸如电话簿之类的应用程序,根据列表填充数据等等。

图片

这就总结了Python中所有重要的数据结构。我希望您已经了解了Python中的内置和用户定义的数据结构,以及它们的重要性。

浏览网页:https://www.itxiaonv.com/,了解更多IT信息

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容