容器概念

容器是Python中的重要概念,分为有序与无序。

有序容器也称为序列类型容器,如:字符串、列表。

通用序列容器操作

容器连接+

加号可以把两个序列连接成一个更大的容器,相加后两个序列的值并不改变

>>> s1='abc'
>>> s2='def'
>>> s3=s1+s2
>>> s3
'abcdef'
>>> s1
'abc'
>>> s2
'def'
>>> l1=[1,2,3]
>>> l2=[4,5,6]
>>> l3=l1+l2
>>> l3
[1, 2, 3, 4, 5, 6]
>>> l1
[1, 2, 3]
>>> l2
[4, 5, 6]

数乘

一个序列容器乘以一个整数,把序列重复整数遍。相乘后原序列依然不发生变化。

>>> s1='ab'
>>> s2=s1*3
>>> s2
'ababab'
>>> l1=[1,2]
>>> l2=l1*3
>>> l2
[1, 2, 1, 2, 1, 2]

in与not in

in判断一个元素是否在序列容器中,not in判断是否不再序列容器中,返回值为布尔类型。

>>> s1='abc'
>>> 'a'in s1
True
>>> 'ab'in s1
True
>>> 'd' in s1
False
>>> l1=[1,2,3]
>>> 1 in l1
True
>>> [1,2] in l1#错误因为[1,2]不在[1,2]中
False`
>>> [1,2] in [[1,2],3]#正确
True

索引[]

取单个元素,从0开始计数。

我们一个称第一个元素为第一个,第零号。

最大下标为长度减一,超过此范围会报错。

我们也可以倒着数,最后一个元素为-1,第一个元素为长度的负数。

列表的索引支持重新赋值,字符串不支持

>>> l=[1,2,3]
>>> l[1]=3
>>> l
[1, 3, 3]
>>> s="abc"
>>> s[1]="c"
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
s[1]="c"
TypeError: 'str' object does not support item assignment

切片[]

在一个序列容器l中,有l[a:b]其中a<b,(若a>b,l[a:b]为空串)

l[a:b]=l[a]+l[a+1]+......+l[b-1]。(若a=0,a可以省略)

在切片中依然可以只用负数索引,并且有时可以做到一些直接索引不好做的操作。

如,我们要把一个数字+一个字符的串中的最后一个字符去掉,直接使用切片似乎不太好处理,因为我们无法确定数字的长度。

这时我们可以使用[0:-1],我们切刀的第一个元素到倒数第二个元素。巧妙地解决了这个问题。

>>> s="25c"
>>> s[:-1]
'25'

(注意,如果序列容器中,我们可以在切片中使用长度(这似乎看上去并不合理),这是为了解决无法切片得到最后一个元素的问题,但我们通常不推荐这么做,我们通常使用省略最后一个切片范围的方法来使得切片取到最后一个字符)

通用序列容器函数

len函数

获得序列容器的长度。

min函数

获得序列容器中最小的元素。

max函数

获得序列容器中的最大元素。

sort函数

排序函数,按照ASC码顺序排序。

字符串特性

字符串中的引号与转义

如果需要在字符串中使用单引号,我们可以使用双引号包裹。

如果需要在字符串中使用双引号,我们可以使用单引号包裹。

>>> a="'a'+'b'"
>>> a
"'a'+'b'"
>>> a='"a"+"b"'
>>> a
'"a"+"b"'

也可以使用反斜杠(左上到右下)做转义。

>>> a="\'a\'+\'b\'"
>>> a
"'a'+'b'"

三个单引号或者三个双引号,可以使字符串保留回车。

>>> """
a
cacad
casdw
,
"""
'\na\ncacad\ncasdw\n,\n'

如果想在输出时在多行书写,但同时最后的结果不会换行,可以在行末加反斜杠。

>>> s="adad\
vasd\
avasddaw\
,\
"
>>> print(s)
adadvasdavasddaw,

如果想使输入时的字符,不被识别成转义字符,我们可以在引号前面加一个r。

>>> s=r'a\ndjwaid\tdad'
>>> s
'a\\ndjwaid\\tdad'
>>> print(s)
a\ndjwaid\tdad

字符串特有函数(方法)

lower和upper

把大写变成小写,不会改变原来字符串

>>> s="ADADWDADS"
>>> s.lower()
'adadwdads'
>>> s
'ADADWDADS'

upper是把小写变成大写,使用方法与lower一致。

find

find("s",a,b)从左往右数第一次在字符串的[a,b-1]范围中出现的位置。

如果找不到则返回-1

>>> s.find("p",0,2)
-1
>>> s.find("p",0,3)
2

count

count('s')计算s在字符串中出现的次数。

>>> s="hello,world"
>>> s.count('l')
3

strip、lstrip、rstrip

strip去掉左右两边空格,lstrip去掉左边空格,rstrip去掉右边空格。

>>> s=' hello world    '
>>> s.strip()
'hello world'
>>> s.lstrip()
'hello world '
>>> s.rstrip()
' hello world'

replace

replace('s1','s2')把字符串中的's1'替换成's2'

>>> s=' hello world '
>>> s.replace(' ','-')
'-hello-world-'

%

字符串的格式化,类似于C/C++中,不同的是后面也要用%,如print("%d+%f"%(1,1.2)),这里略。

列表特性

列表的字面是可以是表达式

>>> a=6
>>> b=8
>>> [a,b]
[6, 8]
>>> [a+2,b-a]
[8, 2]

list函数可以将其他类型转换成列表

>>> s="this is a string"
>>> list(s)
['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g']

如果列表的元素还是一个列表,就形成了广义表

>>> t=[[1,2,3],[4,5,6],[7,8,9]]
>>> len(t)
3
>>> t[0]
[1, 2, 3]
>>> t[0][0]
1

列表的赋值并不重分配空间

列表的赋值并不重分配空间,只是把新变量的指针也指向原来的变量指向的地址。这导致了,改变被赋值的变量会导致原变量被修改,这与其他变量的赋值不同。

>>> t=[1,2,3]
>>> t[0]
1
>>> l=t
>>> l[0]
1
>>> l[0]=2
>>> l
[2, 2, 3]
>>> t
[2, 2, 3]

如图:

列表切片的其他应用

为了解决上面的问题,我们可以使用切片

如果想要重新分配一个空间来让新变量拥有可以使用切片的方法。

>>> t1=[1,2,3]
>>> t2=t1[:]#省略开头结尾,表示从0开始一直到结束
>>> t2[0]=0
>>> t1
[1, 2, 3]
>>> t2
[0, 2, 3]

如图:



使用切片时,如果切片在赋值号右边,那么它会给左边的变量分配新的空间,

如果在左边,那么它指向的是原来的空间,所以可以通过改变切片的值来改变原来的空间。

>>> t=[1,2,3,4,5,6,7,8,9,10]
>>> ts=t[2:4]
>>> t[2:4]=[10,20]
>>> ts
[3, 4]
>>> t
[1, 2, 10, 20, 5, 6, 7, 8, 9, 10]

如图:



甚至可以赋与切片中元素个数不同的列表。

>>> t[2:4]=[10,20,30]
>>> t
[1, 2, 10, 20, 30, 5, 6, 7, 8, 9, 10]

我们也可以利用这一特性来删除元素

>>> t[2:4]=[]#删除第二个第三个元素。
>>> t
[1, 2, 30, 5, 6, 7, 8, 9, 10]
```python
##del运算符
在del后面加上要删除的元素,即可在列表中删除这一元素。
如果要删除整个列表,可以直接del+列表名即可。
```python
>>> t=[1,2,3,4,5,6]
>>> del t[2]
>>> t
[1, 2, 4, 5, 6]
>>> del t
>>> t
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
t
NameError: name 't' is not defined

列表的函数

append

相当于C++中STL的push_back,把一个新的元素添加的列表的最后。

extend

相当容器连接运算符+,把两个列表连接起来。

(注意:append与extend看似内容相似,实际上功能上还是有着很大的差异,append是添加元素,它的参数应该为一个字面量或者表达式,而extend的作用是扩展列表,连接两个列表,后面的参数必须也是一个列表)

>>> t=[1,2,3,4,5,6,7,8]
>>> t.append(10)
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10]
>>> t.extend([1,2,3])
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3]
>>> t.append([1,2,3])#这是正确的因为列表也是一个字面量
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, [1, 2, 3]]
>>> t.extend(1)#下面报错,因为参数不为列表
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
t.extend(1)
TypeError: 'int' object is not iterable

insert函数

insert函数有两个参数,第一个参数指定在哪个元素前面插入(0~INF),第二个元素指定要插入的元素(字面量或者表达式)

>>> t=[1,2,3,4,5,6,7]
>>> t.insert(0,0)
>>> t
[0, 1, 2, 3, 4, 5, 6, 7]
>>> t.insert(0,[1,2])
>>> t
[[1, 2], 0, 1, 2, 3, 4, 5, 6, 7]

当insert的第一个参数超过了列表的最大下标时,我们会把元素添加到列表尾部。

>>> t=[1,2,3,4,5,6]
>>> t.insert(100,1)
>>> t
[1, 2, 3, 4, 5, 6, 1]

remove函数

删除元素,与del运算符不同的是,del是删除指定位置的元素,remove是删除指定值(第一个)的元素。

如果有很多指定值,那么删除第一个。

>>> t=[1,2,3,4,5,6,2]
>>> t.remove(2)
>>> t
[1, 3, 4, 5, 6, 2]

pop函数

与数据结构中堆栈的pop一致,即弹出最后一个元素,函数的返回值为该元素的值。

如果该函数带有参数,那么弹出的值为该位置元素的值。

>>> t=[1,2,3,4,5,6,7,8]
>>> t.pop()
8
>>> t.pop(2)
3
>>> t
[1, 2, 4, 5, 6, 7]

reverse函数

翻转列表,没有什么好说的。

>>> t=[1,2,3]
>>> t.reverse()
>>> t
[3, 2, 1]

index函数

与字符串的find函数一致,返回指定元素在列表中的位置,如果有多个就返回第一个。

与find函数基本一致

>>> t=[1,3,4,5,7,3,4,24]
>>> t.index(4,3,9)
6
>>> t.index(4)
2
>>> t.index(4,3)
6

列表推导式

列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它可以将循环和条件判断结合,从而避免语法冗长的代码,同时提高程序性能。

基本格式:

[expression for item in iterable]

如,我们要产生2,4,6,8,10的列表可以使用n1=[2*n for n in [1,2,3,4,5]]

待条件的列表解析

[expression for item in iterable if condition] or

[expression if condition else expression for item in iterable]

>>> l=[n for n in range(1,8) if n%2==1]
>>> l
[1, 3, 5, 7]

例如:求1-1/2+...-1/20之和

>>> a=sum([1/i if i%2==1 else -1/i for i in range(1,21)])
>>> a
0.6687714031754279

列表与字符串的转换

split函数

默认无参时把字符串按空格分隔成列表。

>>> s="this is a string"
>>> s.split()
['this', 'is', 'a', 'string']

带参数时按照参数分隔。

>>> s="12:35"
>>> s.split(":")
['12', '35']

join函数

把一个列表按照某个字符串来作为连接,格式为s.join(l),其中s为连接的字符串,l为列表。

>>> l=["hello","world"]
>>> "-".join(l)
'hello-world'

元组

与列表基本一样,但是元组是用圆括号'('包裹的。并且元组中的元素不能被改变(可以看出C/C++中的const string)!

元组与字符串一致都不支持元素的重新赋值。

元组可以使用除了修改元素的所有的列表的函数。

一般不加括号的容器默认为元组。

>>> a,b=3,4
>>> a
3
>>> b
4
>>> p=3,4
>>> p
(3, 4)

tuple函数

可以用tuple函数把其他容器转化为元组。

随机库random

使用随机函数前需要import random

shuffle函数

random.shuffle(t)

把容器t随机打乱。

>>> import random
>>> t=["zyk","zjc","ysy","xhm"]
>>> random.shuffle(t)
>>> t
['ysy', 'xhm', 'zyk', 'zjc']
>>> random.shuffle(t)
>>> t
['xhm', 'zjc', 'zyk', 'ysy']

其他函数详见:python--随机函数(random,uniform,randint,randrange,shuffle,sample)

随机数种子

seed(int a),每个种子获得的随机数是相同的,可以借此来完成一些特殊的任务。

MOOC python笔记(三) 序列容器:字符串、列表、元组的更多相关文章

  1. Python第三天 序列 数据类型 数值 字符串 列表 元组 字典

    Python第三天 序列  数据类型  数值  字符串  列表  元组  字典 数据类型数值字符串列表元组字典 序列序列:字符串.列表.元组序列的两个主要特点是索引操作符和切片操作符- 索引操作符让我 ...

  2. Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式

    Python第三天 序列  5种数据类型  数值  字符串  列表  元组  字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell ...

  3. python字符串列表元组序列操作

    Table of Contents generated with DocToc python系列-字符串.列表.元组的操作 序列的访问及运算符 序列通用操作 访问单个元素 切片访问一部分元素 序列的复 ...

  4. Python学习三---序列、列表、元组

    一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...

  5. Python基础灬序列(字符串、列表、元组)

    序列 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员.序列包含字符串.列表.元组. 字符串 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' print(c ...

  6. MOOC python笔记(二)python中的数据类型和基本语句

    python数据类型 数字类型 整数(int) 与数学中整数概念一致(数字大小没有限制,这和其他语言不同),整数可正可负,默认情况下,整数采用十进制.其他进制需要增加相应的引导符号. 如果是二进制在前 ...

  7. day5_python学习笔记_chapter6_字符串列表元组

    1. 序列:seq[n], seq[x:y], seq * n序列重复n次,切片, 序列翻转 s=”abcde", s[::-1]="edcba" 内建函数:1. 类型转 ...

  8. python笔记(2)--字符串

    一.创建字符串 使用 '' , "" , ''' 和 """ 来创建字符串 var1 = 'hello, world' var2 = "ja ...

  9. Python基础:序列(字符串)

    一.概述 字符串 类似于C中的字符数组(功能上更像C++中的string),它是由一个个 字符 组成的序列.与C/C++不同的是,Python中没有 字符 这个类型,而是用 长度为1的字符串 来表示字 ...

随机推荐

  1. charles 客户端进程

    本文参考:charles 客户端进程 客户端进程工具/client_process 显示使每个请求的本地客户端进程; 客户端进程工具显示负责进行每个请求的本地客户端进程的名称. 客户端进程通常是您的W ...

  2. Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)

    一.写在前面 其实之前已经写过一篇关于 Flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 Flask + MySQL8.0 时所遇到的一些问题(如果用的不是 MySQL8.0估计就没 ...

  3. 腾讯、阿里、百度、360、114 公共DNS分享

    DNS,在互联网有着重要的地位,域名转换成IP,都是DNS在工作. 腾讯 DNS+ IP:119.29.29.29 备用:182.254.116.116 阿里DNS ip:223.5.5.5 223. ...

  4. CentOS7下LVM的基本操作

    CentOS7下LVM的基本操作-创建LVM 环境 物理主机:windows10 虚拟软件:VMWare14 虚拟机:CentOS Linux release 7.6.1810 (Core) 软件环境 ...

  5. php下api接口的并发http请求

    php下api接口的并发http请求 ,提高app一个页面请求多个api接口,页面加载慢的问题: func_helper.php/** * 并发http请求 * * [ * 'url' //请求地址 ...

  6. 【linux】【PostgreSQL】PostgreSQL安装

    前言 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTGR ...

  7. asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库

    在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactories DbProviderFactories类在.netframework ...

  8. Unity-遇到的问题小总结

    1. event trigger后面显示不了对应的方法 原因:我是直接把脚本拖拽进去的,这是没有实例化的,拖拽进去的应该是挂载这个脚本的GameObject就可以了 2.制作prefeb 将场景中的单 ...

  9. CDH集群的配置优化须知

           通过改善IFile阅读器的性能 IFile Reader,进而可改善随机处理程序并减少储备空间,达到MapReduce的配置最佳实践要求.而MapReduce shuffle的处理程序和 ...

  10. Python 设计和历史的 27 个问题

    花下猫语: 先祝大家假期快乐!今天,我要分享一篇长文,选自 Python 的官方文档.它列举了 27 个设计及历史的问题,其中有些问题我曾经分享过,例如为什么使用显式的 self.浮点数的问题.len ...