python数据结构的应用场景不包括,Python 数据结构学习

Python 数据结构学习

列表

list.append(x)

在列表的末尾添加一个元素。相当于 a[len(a):] = [x] 。

list.extend(iterable)

使用可迭代对象中的所有元素来扩展列表。相当于 a[len(a):] = iterable 。

list.insert(i, x)

在给定的位置插入一个元素。第一个参数是要插入的元素的索引,所以 a.insert(0, x) 插入列表头部, a.insert(len(a), x) 等同于 a.append(x) 。

list.remove(x)

移除列表中第一个值为 x 的元素。如果没有这样的元素,则抛出 ValueError 异常。

list.pop([i])

删除列表中给定位置的元素并返回它。如果没有给定位置,a.pop() 将会删除并返回列表中的最后一个元素。( 方法签名中 i 两边的方括号表示这个参数是可选的,而不是要你输入方括号。你会在 Python 参考库中经常看到这种表示方法)。

list.clear()

移除列表中的所有元素。等价于del a[:]

list.index(x[, start[, end]])

返回列表中第一个值为 x 的元素的从零开始的索引。如果没有这样的元素将会抛出 ValueError 异常。

可选参数 start 和 end 是切片符号,用于将搜索限制为列表的特定子序列。返回的索引是相对于整个序列的开始计算的,而不是 start 参数。

list.count(x)

返回元素 x 在列表中出现的次数。

list.sort(key=None, reverse=False)

对列表中的元素进行排序(参数可用于自定义排序,解释请参见 sorted())。

list.reverse()

翻转列表中的元素。

list.copy()

返回列表的一个浅拷贝,等价于 a[:]。

>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']

>>> fruits.count('apple')

2

>>> fruits.count('tangerine')

0

>>> fruits.index('banana')

3

>>> fruits.index('banana', 4) # Find next banana starting a position 4

6

>>> fruits.reverse()

>>> fruits

['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']

>>> fruits.append('grape')

>>> fruits

['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']

>>> fruits.sort()

>>> fruits

['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']

>>> fruits.pop()

'pear'

你可能已经注意到,像 insert ,remove 或者 sort 方法,只修改列表,没有打印出返回值——它们返回默认值 None 。1 这是Python中所有可变数据结构的设计原则。

你可能会注意到的另一件事是并非所有数据或可以排序或比较。 例如,[None, 'hello', 10] 就不可排序,因为整数不能与字符串比较,而 None 不能与其他类型比较。 并且还存在一些没有定义顺序关系的类型。 例如,3+4j < 5+7j 就不是一个合法的比较。

列表作为栈使用

列表方法使得列表作为堆栈非常容易,最后一个插入,最先取出(“后进先出”)。要添加一个元素到堆栈的顶端,使用 append() 。要从堆栈顶部取出一个元素,使用 pop() ,不用指定索引。例如

>>> stack = [3, 4, 5]

>>> stack.append(6)

>>> stack.append(7)

>>> stack

[3, 4, 5, 6, 7]

>>> stack.pop()

7

>>> stack

[3, 4, 5, 6]

>>> stack.pop()

6

>>> stack.pop()

5

>>> stack

[3, 4]

列表作为队列使用

列表也可以用作队列,其中先添加的元素被最先取出 (“先进先出”);然而列表用作这个目的相当低效。因为在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。

若要实现一个队列,可使用 collections.deque,它被设计成可以快速地从两端添加或弹出元素。例如

>>> from collections import deque

>>> queue = deque(["Eric", "John", "Michael"])

>>> queue.append("Terry") # Terry arrives

>>> queue.append("Graham") # Graham arrives

>>> queue.popleft() # The first to arrive now leaves

'Eric'

>>> queue.popleft() # The second to arrive now leaves

'John'

>>> queue # Remaining queue in order of arrival

deque(['Michael', 'Terry', 'Graham'])

列表推导式

列表推导式提供了一个更简单的创建列表的方法。常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列。

例如,假设我们想创建一个平方列表,像这样

>>> squares = []

>>> for x in range(10):

... squares.append(x**2)

...

>>> squares

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

注意这里创建(或被重写)的名为 x 的变量在for循环后仍然存在。我们可以计算平方列表的值而不会产生任何副作用

squares = list(map(lambda x: x**2, range(10)))

或者,等价于

squares = [x**2 for x in range(10)]

上面这种写法更加简洁易读。

列表推导式的结构是由一对方括号所包含的以下内容:一个表达式,后面跟一个 for 子句,然后是零个或多个 for 或 if 子句。 其结果将是一个新列表,由对表达式依据后面的 for 和 if 子句的内容进行求值计算而得出。 举例来说,以下列表推导式会将两个列表中不相等的元素组合起来:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

而它等价于

>>> combs = []

>>> for x in [1,2,3]:

... for y in [3,1,4]:

... if x != y:

... combs.append((x, y))

...

>>> combs

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

注意在上面两个代码片段中, for 和 if 的顺序是相同的。

如果表达式是一个元组(例如上面的 (x, y)),那么就必须加上括号

>>> vec = [-4, -2, 0, 2, 4]

>>> # create a new list with the values doubled

>>> [x*2 for x in vec]

[-8, -4, 0, 4, 8]

>>> # filter the list to exclude negative numbers

>>> [x for x in vec if x >= 0]

[0, 2, 4]

>>> # apply a function to all the elements

>>> [abs(x) for x in vec]

[4, 2, 0, 2, 4]

>>> # call a method on each element

>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']

>>> [weapon.strip() for weapon in freshfruit]

['banana', 'loganberry', 'passion fruit']

>>> # create a list of 2-tuples like (number, square)

>>> [(x, x**2) for x in range(6)]

[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

>>> # the tuple must be parenthesized, otherwise an error is raised

>>> [x, x**2 for x in range(6)]

File "", line 1, in

[x, x**2 for x in range(6)]

^

SyntaxError: invalid syntax

>>> # flatten a list using a listcomp with two 'for'

>>> vec = [[1,2,3], [4,5,6], [7,8,9]]

>>> [num for elem in vec for num in elem]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

列表推导式可以使用复杂的表达式和嵌套函数

>>> from math import pi

>>> [str(round(pi, i)) for i in range(1, 6)]

['3.1', '3.14', '3.142', '3.1416', '3.14159']

嵌套的列表推导式

列表推导式中的初始表达式可以是任何表达式,包括另一个列表推导式。

考虑下面这个 3x4的矩阵,它由3个长度为4的列表组成

>>> matrix = [

... [1, 2, 3, 4],

... [5, 6, 7, 8],

... [9, 10, 11, 12],

... ]

下面的列表推导式将交换其行和列

>>> [[row[i] for row in matrix] for i in range(4)]

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

如上节所示,嵌套的列表推导式是基于跟随其后的 for 进行求值的,所以这个例子等价于:

>>> transposed = []

>>> for i in range(4):

... transposed.append([row[i] for row in matrix])

...

>>> transposed

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

反过来说,也等价于

>>> transposed = []

>>> for i in range(4):

... # the following 3 lines implement the nested listcomp

... transposed_row = []

... for row in matrix:

... transposed_row.append(row[i])

... transposed.append(transposed_row)

...

>>> transposed

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

实际应用中,你应该会更喜欢使用内置函数去组成复杂的流程语句。 zip() 函数将会很好地处理这种情况

>>> list(zip(*matrix))

[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

del 语句

有一种方式可以从列表按照给定的索引而不是值来移除一个元素: 那就是 del 语句。 它不同于会返回一个值的 pop() 方法。 del 语句也可以用来从列表中移除切片或者清空整个列表(我们之前用过的方式是将一个空列表赋值给指定的切片)。 例如:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]

>>> del a[0]

>>> a

[1, 66.25, 333, 333, 1234.5]

>>> del a[2:4]

>>> a

[1, 66.25, 1234.5]

>>> del a[:]

>>> a

[]

del 也可以删除整个变量

>>> del a

此后再引用 a 时会报错(直到另一个值被赋给它)。我们会在后面了解到 del 的其他用法。

元组和序列

我们看到列表和字符串有很多共同特性,例如索引和切片操作。他们是 序列 数据类型(参见 序列类型 --- list, tuple, range)中的两种。随着 Python 语言的发展,其他的序列类型也会被加入其中。这里介绍另一种标准序列类型: 元组。

一个元组由几个被逗号隔开的值组成,例如

>>> t = 12345, 54321, 'hello!'

>>> t[0]

12345

>>> t

(12345, 54321, 'hello!')

>>> # Tuples may be nested:

... u = t, (1, 2, 3, 4, 5)

>>> u

((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

>>> # Tuples are immutable:

... t[0] = 88888

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

>>> # but they can contain mutable objects:

... v = ([1, 2, 3], [3, 2, 1])

>>> v

([1, 2, 3], [3, 2, 1])

如你所见,元组在输出时总是被圆括号包围的,以便正确表示嵌套元组。输入时圆括号可有可无,不过经常会是必须的(如果这个元组是一个更大的表达式的一部分)。给元组中的一个单独的元素赋值是不允许的,当然你可以创建包含可变对象的元组,例如列表。

虽然元组可能看起来与列表很像,但它们通常是在不同的场景被使用,并且有着不同的用途。元组是 immutable ,其序列通常包含不同种类的元素,并且通过解包(这一节下面会解释)或者索引来访问(如果是 namedtuples 的话甚至还可以通过属性访问)。列表是 mutable ,并且列表中的元素一般是同种类型的,并且通过迭代访问。

一个特殊的问题是构造包含0个或1个元素的元组:为了适应这种情况,语法有一些额外的改变。空元组可以直接被一对空圆括号创建,含有一个元素的元组可以通过在这个元素后添加一个逗号来构建(圆括号里只有一个值的话不够明确)。丑陋,但是有效。例如

>>> empty = ()

>>> singleton = 'hello', #

>>> len(empty)

0

>>> len(singleton)

1

>>> singleton

('hello',)

语句 t = 12345, 54321, 'hello!' 是 元组打包 的一个例子:值 12345, 54321 和 'hello!' 被打包进元组。其逆操作也是允许的

>>> x, y, z = t

这被称为 序列解包 也是很恰当的,因为解包操作的等号右侧可以是任何序列。序列解包要求等号左侧的变量数与右侧序列里所含的元素数相同。注意多重赋值其实也只是元组打包和序列解包的组合。

集合

Python也包含有 集合 类型。集合是由不重复元素组成的无序的集。它的基本用法包括成员检测和消除重复元素。集合对象也支持像 联合,交集,差集,对称差分等数学运算。

花括号或 set() 函数可以用来创建集合。注意:要创建一个空集合你只能用 set() 而不能用 {},因为后者是创建一个空字典,这种数据结构我们会在下一节进行讨论。

以下是一些简单的示例

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}

>>> print(basket) # show that duplicates have been removed

{'orange', 'banana', 'pear', 'apple'}

>>> 'orange' in basket # fast membership testing

True

>>> 'crabgrass' in basket

False

>>> # Demonstrate set operations on unique letters from two words

...

>>> a = set('abracadabra')

>>> b = set('alacazam')

>>> a # unique letters in a

{'a', 'r', 'b', 'c', 'd'}

>>> a - b # letters in a but not in b

{'r', 'd', 'b'}

>>> a | b # letters in a or b or both

{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}

>>> a & b # letters in both a and b

{'a', 'c'}

>>> a ^ b # letters in a or b but not both

{'r', 'd', 'b', 'm', 'z', 'l'}

类似于 列表推导式,集合也支持推导式形式

>>> a = {x for x in 'abracadabra' if x not in 'abc'}

>>> a

{'r', 'd'}

字典

另一个非常有用的 Python 內置数据类型是 字典 (参见 映射类型 --- dict)。字典在其他语言里可能会被叫做 联合内存 或 联合数组。与以连续整数为索引的序列不同,字典是以 关键字 为索引的,关键字可以是任意不可变类型,通常是字符串或数字。如果一个元组只包含字符串、数字或元组,那么这个元组也可以用作关键字。但如果元组直接或间接地包含了可变对象,那么它就不能用作关键字。列表不能用作关键字,因为列表可以通过索引、切片或 append() 和 extend() 之类的方法来改变。

理解字典的最好方式,就是将它看做是一个 键: 值 对的集合,键必须是唯一的(在一个字典中)。一对花括号可以创建一个空字典:{} 。另一种初始化字典的方式是在一对花括号里放置一些以逗号分隔的键值对,而这也是字典输出的方式。

字典主要的操作是使用关键字存储和解析值。也可以用 del 来删除一个键值对。如果你使用了一个已经存在的关键字来存储值,那么之前与这个关键字关联的值就会被遗忘。用一个不存在的键来取值则会报错。

对一个字典执行 list(d) 将返回包含该字典中所有键的列表,按插入次序排列 (如需其他排序,则要使用 sorted(d))。要检查字典中是否存在一个特定键,可使用 in 关键字。

以下是使用字典的一些简单示例

>>> tel = {'jack': 4098, 'sape': 4139}

>>> tel['guido'] = 4127

>>> tel

{'jack': 4098, 'sape': 4139, 'guido': 4127}

>>> tel['jack']

4098

>>> del tel['sape']

>>> tel['irv'] = 4127

>>> tel

{'jack': 4098, 'guido': 4127, 'irv': 4127}

>>> list(tel)

['jack', 'guido', 'irv']

>>> sorted(tel)

['guido', 'irv', 'jack']

>>> 'guido' in tel

True

>>> 'jack' not in tel

False

dict() 构造函数可以直接从键值对序列里创建字典。

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])

{'sape': 4139, 'guido': 4127, 'jack': 4098}

此外,字典推导式可以从任意的键值表达式中创建字典

>>> {x: x**2 for x in (2, 4, 6)}

{2: 4, 4: 16, 6: 36}

当关键字是简单字符串时,有时直接通过关键字参数来指定键值对更方便

>>> dict(sape=4139, guido=4127, jack=4098)

{'sape': 4139, 'guido': 4127, 'jack': 4098}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Jinkey 原创]震惊!iOS 系统居然自带悬浮窗口调试工具

原文链接 : 震惊&#xff01;iOS 系统居然自带悬浮窗口调试工具 —— Jinkey 原创原文作者 : Jinkey1 背景 英文原文&#xff1a;http://ryanipete.com/blog/ios/swift/objective-c/uidebugginginformationoverlay/ 我写得这个并不是翻译而是用自己的理解重新表述这个功能&…

盲人编程_盲人如何编码

盲人编程About one out of every 200 software developers is blind. We know this because Stack Overflow asked 64,000 developers about this a few months ago.每200名软件开发人员中大约有1名是盲人。 我们之所以知道这一点&#xff0c;是因为几个月前 Stack Overflow 向…

hadoop环境搭建笔记

一、配置Linux &#xff08;1&#xff09;cat /etc/networks &#xff08;2&#xff09;cat /etc/sysconfig/network &#xff08;3&#xff09;vi /etc/udev/rules.d/70-persistent-net.rules eth1 改为eth0 &#xff08;4&#xff09;vi /etc/sysconfig/network-scripts/ifc…

边分治讲解

前言&#xff1a; 边分治和点分治一样属于树分治的一部分&#xff0c;相比于点分治&#xff0c;边分治对于与度数相关的问题有着很大的优势&#xff0c;同时边分治也是解决树上最优化问题的一种重要的算法。 分治过程&#xff1a; 边分治的分治过程与点分治类似&#xff0c;同样…

准确性 敏感性 特异性_如何掌握类型特异性的艺术

准确性 敏感性 特异性Do more specific definitions result in less flexibility?更具体的定义会导致灵活性降低吗&#xff1f; In this post I will try to avoid the debate about strong/static vs. weak/dynamic types (what more could possibly be said?), or even sc…

Pycharm社区版配置Django

Pycharm开发版(收费)自带Django模板&#xff0c;社区版(免费)需要通过命令行创建Django项目。 通过pip安装Django&#xff1a;pip install django2.0.2(版本号)&#xff0c;可通过以下命令检查是否安装成功 在命令行下创建Django项目(项目存放在D:\PyCharm) 1.创建项目 进入D:\…

家里也是不知不觉就电脑有不能开启了

一如既往的把电脑搬上去&#xff0c;我推测就是因为内存条金手指的接触不好了&#xff0c;然后多次的强制关机让我心疼&#xff0c;还有是花了30元装系统还是有些不服气&#xff0c;最后还是要回去弄好。 转载于:https://www.cnblogs.com/bkchengzheng/p/5662222.html

oracle model 分组,【已解决】关于Oracle分组函数高级用法(按照N条分组并生成唯一号)...

prompt PL/SQL Developer import fileprompt Created on 2018年3月30日 byset feedback offset define offprompt Creating T_TEST_GROUP...create table T_TEST_GROUP(code VARCHAR2(100),supplier VARCHAR2(100),item_id VARCHAR2(100),num NUMBER,lot VARCHA…

用Mesos分布式架构进行工作

引言&#xff1a;2010年&#xff0c;一个旨在解决扩容问题的项目诞生——Apache Mesos&#xff0c;它在某种程度上对CPU、内存、磁盘资源进行抽象&#xff0c;从而允许整个数据中心如同单台大服务器般运转。无需虚拟机和操作系统&#xff0c;Mesos创造了一个单独底层的集群为应…

angular和react_如何在Angular中验证默认和自定义React形式

angular和reactby Luuk GruijsLuuk Gruijs着 如何在Angular中验证默认和自定义React形式 (How to validate default and custom reactive forms in Angular) When presenting forms to your users, it’s considered very user-friendly to give them immediate feedback on w…

POJ 1502 MPI Maelstrom 最短路

最短路模板。 题意&#xff1a;从‘1’点发出一个信号到各个点&#xff0c;不同的点可以同时发出一个信号但到达目标的时间不同&#xff0c;问所有点接受到信号所耗费的最短时间为多少。 思路&#xff1a;迪杰斯特拉求出1点到各个点的最短路&#xff0c;遍历一遍找到其中的最大…

调试dump文件

调试dump文件 1、设置好pdb文件和源代码路径 为了能正确分析Dump文件&#xff0c;我们必须要指定和程序一起出来的PDB文件&#xff0c;如果程序重新被编译了一次&#xff0c;即使代码没有任何变化&#xff0c;之前的PDB文件我们不能再继续使用。posted on 2018-12-28 17:50 mao…

不一样的视角,程序员世界里的环保

摘要&#xff1a; 我们身边有很多可以做的技术环保工作。比如说&#xff0c;在Linux下少用root用户&#xff0c;SQL的时候&#xff0c;delete前先select&#xff0c;这样&#xff0c;你就不会做出一些让你后悔的事。不会让你重头来过&#xff0c;从而至少不会浪费电能。写代码的…

oracle查出连续5行,Oracle期末考试复习题2

复习题一、填空题&#xff1a;1. Oracle EnterpriseManager是一个基于 B/S的框架系统。2&#xff0e;Oracle数据库的存储结构分为物理结构和逻辑结构。3&#xff0e;在游标或者游标变量打开后还没有进行第一次提取时&#xff0c;&#xff05;found属性为null。4. 在oracle中已c…

selinux会阻碍挂载嘛_为什么追求完美可能会阻碍您成为新手Web开发人员

selinux会阻碍挂载嘛by Rick West由里克韦斯特(Rick West) 为什么追求完美可能会阻碍您成为新手Web开发人员 (Why striving for perfection might be holding you back as a newbie web developer) I am a perfectionist. Or, at least, I like to think I am. Either way, I’…

MySQL优化的一些基础

在Apache, PHP, mysql的体系架构中&#xff0c;MySQL对于性能的影响最大&#xff0c;也是关键的核心部分。对于Discuz!论坛程序也是如此&#xff0c;MySQL的设置是否合理优化&#xff0c;直接 影响到论坛的速度和承载量&#xff01;同时&#xff0c;MySQL也是优化难度最大的一个…

oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock

1、Oracle锁类型锁的作用latch锁&#xff1a;chain&#xff0c;链LOCK锁排他锁(X)共享锁(S)2、行级锁&#xff1a;DML语句事务锁TX锁的结构事务锁的加锁和解锁过程只有排他锁不影响读(CR块)3、表级锁&#xff1a;TM行级排他锁(Row exclusive)RX锁当我们进行DML时&#xff0c;会…

电线之间:采访Microsoft Edge性能PM Nolan Lawson

by Vivian Cromwell通过维维安克伦威尔(Vivian Cromwell) 电线之间&#xff1a;采访Microsoft Edge性能PM Nolan Lawson (Between the Wires: An interview with Microsoft Edge performance PM Nolan Lawson) I interviewed Nolan Lawson, Web Performance PM at Microsoft E…

swift菜鸟入门视频教程-09-类和结构体

本人自己录制的swift菜鸟入门&#xff0c;欢迎大家拍砖&#xff0c;有什么问题能够在这里留言。主要内容&#xff1a;类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合&#xff08;collection&#xff09;类型的赋值与复制行为视频地址&#xff1a;百度…

oracle的集合操作符,[Oracle] Oracle的集合操作符

Oracle的集合操作包括: union , intersect , minus.[例子]假设有两个表a,b如下:SQL> select * from a;COLA----------123SQL> select * from b;COLB----------345union : 得到两个结果集的并集(不含重复值)SQL> select * from a2 union3 select * from b;COLA------…