容器概念

容器是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. ES6中的迭代器、Generator函数以及Generator函数的异步操作

    最近在写RN相关的东西,其中涉及到了redux-saga ,saga的实现原理就是ES6中的Generator函数,而Generator函数又和迭代器有着密不可分的关系.所以本篇博客先学习总结了ite ...

  2. 教你用java统计目录下所有文档的词频

    本文是统计目录下所有文档的词频top10,非单个文档,包含中文和英文. 直接上代码: package com.huawei.wordcount; import java.io.BufferedRead ...

  3. pt-table-sync 配合pt-table-checksum 修复主从不一致

    pt-table-sync 配合pt-table-checksum 修复主从不一致. 先执行下面这条语句,打印出要执行的命令,确认无误后再将  --print  改为  --execute 执行.注意 ...

  4. AppScan工具使用-实战一

    本文首发于简书https://www.jianshu.com/p/639cf894838e 工具已经安装完成,废话不多说,直接拿手上的项目使用一下. 1.打开工具,点击文件-新建 2.打开新建扫描 3 ...

  5. Mybatis源码解析,一步一步从浅入深(七):执行查询

    一,前言 我们在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码的最后一步说到执行查询的关键代码: result = sqlSession.selectOne(command.ge ...

  6. Tomcat 报错 The APR based Apache Tomcat Native library which allows optimal performance in production environmen

    这个问题在我一次重新装了tomcat和myeclipse时出现 说实话 出现这个问题头大 但是好在解决了 美滋滋 最开始到处寻找各种解决方案 最后直接注释了server.xml中的一行 直接解决这个报 ...

  7. Flask中的路由、实例化参数和config配置文件

    Flask中的路由 endpoint 别名不能重复,对应的视图函数,默认是视图函数名.endpoint 才是路由的核心.视图函数与路由的对应关系.可以通过url_for 反向创建url # metho ...

  8. [系列] go-gin-api 路由中间件 - Jaeger 链路追踪(六)

    [DOC] 概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(理论篇),这篇文章咱们接着分享:路由中间件 - Jaeger 链路追踪(实战篇). 这篇文章,确实让大家 ...

  9. 基于Coravel定时任务之物联网设备数量统计

    目录 基于Coravel定时任务之物联网设备数量统计 1 应用背景 2 对比各家定时库 2.1 TaskScheduler 2.2 Fluent Scheduler 2.3 Quartz.net 2. ...

  10. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...