python序列类型及一些操作

序列分类

1.按存放的数据类型分类:

容器类型(能存放不同类型的数据):list、tuple、coolections.deque

扁平序列(只能存放一种类型的数据):str、bytes、bytearray、memoryview、array.array

容器类型存放它们所包含的任意类型的对象的引用,而扁平类型存放的是值而不是引用。(扁平序列是一段连续的存储空间)

2.按能否被修改分类:

可变序列:list、bytearray、array.array、coolections.deque、memoryview

不可变序列:tuple、str、bytes

可变类型继承了不可变类型的一些方法,拓展了一些其他方法。

列表推导式和生成器表达式

列表推导式可以方便的把一个序列或其他可迭代类型中的元素过滤或加工,构建一个新列表。

symbols = ‘acdghlz‘
codes = []
for symbol in symbols:
    codes.append(ord(symbol))
print(codes)

symbols = ‘acdghlz‘
codes = [ord(symbol) for symbol in symbols]
print(codes)

上述两段代码都可以将字符串变为Unicode码位,但相比于普通for循环而言列表推导式显得更简洁明了。而列表推导式只能用于生成列表,生成其他类型的序列就需要用到生成器表达式。

生成器表达式优点:生成器表达式背后遵守迭代器协议,逐个抛出元素,而不是事先建立一个完整列表再把列表传到某个构造函数中。显然生成器表达式更节省内存。

symbols = ‘acdghlz‘
codes_t = tuple(ord(symbol) for symbol in symbols)  //构造一个元组
codes_l = list(ord(symbol) for symbol in symbols)  //构造一个列表
print(codes_t)
print(codes_l)

colors = [‘black‘, ‘white‘]
sizes = [‘S‘,‘M‘,‘L‘]
for tshirt in (‘%s %s‘ % (c,s) for c in colors for s in sizes):  //实现笛卡儿积,逐个产生元素
    print(tshirt)

元组拆包

1.元组拆包默认平行赋值:即把一个可迭代的对象里的元素一并赋值给对应的变量组成的元组中:

x_y = (60,100)
x,y = x_y
print(x,y)    //结果为:60 100

2.可以用*运算符把一个可迭代对象拆开作为函数参数:

print(divmod(20,8))
t = (20,8)
print(divmod(*t))
a, b = divmod(*t)
print((a,b))  //打印结果均为(2,4)

3.元组拆包时若不是对所有元素感兴趣,可使用占位符 _ 处理。

4.用*处理剩下的元素,*前缀只能用在一个变量名前,但这个变量可以出现在表达式的任意位置

a, *body, c, d = (range(7))
print((a, body, c, d))
*head, b, c, d = (range(7))
print((head, b, c, d))
//结果如下:
(0, [1, 2, 3, 4], 5, 6)
([0, 1, 2, 3], 4, 5, 6)

5.具名元组

collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个具有名字的类。具有普通元组的属性和一些专有属性。

切片

list[起始位置:结束位置:步长],三个参数均可为负数。

>>> l=[10,20,30,40,50,60]
>>> l[:2]
[10, 20]
>>> l[2:]
[30, 40, 50, 60]
>>> l[::2]
[10, 30, 50]

切片赋值:若赋值的对象是一个切片,则赋值语句右侧必须是一个可迭代对象,如下:

>>> l = list(range(10))
>>> l[2:5] = 100  //报错
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
l[2:5] = 100
TypeError: can only assign an iterable
>>> l[2:5] = [100]  //结果正常
>>> l
[0, 1, 100, 5, 6, 7, 8, 9]

list.sort和内置函数sorted

sort原地排序,即改变原对象,返回None;sorted创建一个新对象作为返回值,sorted可以接受任何可迭代对象作为参数,返回一个列表。

关键字参数reverse和key

reverse:默认为false,升序;改为true则为降序排列。

key:一个只用一个参数的函数,该函数用于序列中每一个元素,产生的结果作为排序算法依赖的对比关键字。

>>> fruits = [‘grade‘,‘raspberry‘,‘apple‘,‘banana‘]
>>> sorted(fruits)
[‘apple‘, ‘banana‘, ‘grade‘, ‘raspberry‘]  //升序
>>> sorted(fruits,reverse=True)
[‘raspberry‘, ‘grade‘, ‘banana‘, ‘apple‘]  //降序排
>>> sorted(fruits,key=len)
[‘grade‘, ‘apple‘, ‘banana‘, ‘raspberry‘]  //按长度排
>>> sorted(fruits,key=len,reverse=True)
[‘raspberry‘, ‘banana‘, ‘grade‘, ‘apple‘]  //按长度降序
>>> fruits
[‘grade‘, ‘raspberry‘, ‘apple‘, ‘banana‘]  //原对象不变
>>> fruits.sort()                //返回空
>>> fruits
[‘apple‘, ‘banana‘, ‘grade‘, ‘raspberry‘]  //改变原对象

还可用bisect模块中的bisect和insort函数来在有序序列中查找或插入元素(基于二分查找算法)。

某些情况列表不是最好的选择

列表虽然既灵活有简单,但面对各种需求可能有更好的选择。

1.只需要一个只包含数字的列表,那么array.array比list高效。(数组支持所有跟可变序列有关的操作)

还提供了.frombytes和.tofile等更快读写文件的方法。参数为文件对象。

2.内存视图,memoryview是一个内置类,他能在让用户不复制内容的情况下操作同一个数组的不同切片。memoryview.cast概念跟数组模块相似,能用不同方式读写同一块内存数据,且内容字节不会随意变动。如下,用memoryview精准修改了数组某个字节:

>>> import array
>>> numbers = array.array(‘h‘,[-2,-1,0,1,2])    //利用一个短整型有符号数(类型吗h)数组创建一个memoryview
>>> memv = memoryview(numbers)
>>> len(memv)
5
>>> memv[0]
-2
>>> memv_oct = memv.cast(‘B‘)   //将memoryview内容改为‘B‘类型,无符号字符
>>> memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5] = 4   //把位置5的字节赋值成4
>>> numbers
array(‘h‘, [-2, -1, 1024, 1, 2])    //第三个数高位字节改成4,故0变为1024

3.Numpy和Scipy,优秀的科学计算库。处理大量数据时必备。

4.双端队列及其他队列。

collections.deque类可以快速从两端添加或删除元素的数据类型。

queue提供了同步(线程安全)类Queue,LifoQueue,PriorityQueue,不同线程可以用这些数据类型交换信息。三个类构造方法有一个可选参数maxsize,它接受正整数作为输入值,用来限定队列大小。满员时,类不会扔掉旧的元素来腾出位置(相反,deque会扔掉旧元素插入新元素),它会锁住,直到另外的线程移除了某个元素腾出了位置。

还有multiprocessing包(用于进程间通信),asyncio包(类似queue包,但多了JoinableQueue为异步编程里的任务管理提供了专门的便利),heapq包等。

以上内容来自《流畅的python》第二章

原文地址:https://www.cnblogs.com/lht-record/p/10211927.html

时间: 2024-10-05 22:06:57

python序列类型及一些操作的相关文章

python 序列类型

1.不可变的序列类型:tuple.range.str.set 001:对于tuple 类型有如下几种构造方式 1.() 构造一个空的元组. 2.a | (a,) 构造一个只有一个元素的元组. 3.tuple('1') 使用内置的tuple方法构造. 4.(1,2,3) 使用字面值的方法来构造一个元组. 002:对于range就没有这么多的花样了,只有一个构造方法可用 range(起始索引,结束索引,步长) 003:str 也没有太多的花样:它主要用字面值来构造,这些字面值可以用单引号,双引号,三

Python列表类型及常用操作

Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven','law','lyf']) list方法就相当于调用了一个for循环,依次取值放入列表,列表内的元素可以为任意的数据类型 3.常用操作极其内置方法 掌握优先级最高: 1.按照索引取值(正向取,反向取):既能取值也能改值 例如: 执行结果: 2.切片(顾头不顾尾):可以取出列表的部分元素,和实现列表反

Python序列类型

序列:字符.列表.元组     所有序列都支持迭代     序列表示索引为非负整数的有序对象集合     字符和元组属于不可变序列,列表可变 1)字符     字符串字面量:把文本放入单引号.双引号或三引号中:    '    ''    '''         >>> str1 = ' hello, fanison '         >>> type(str1)         str          如果要使用unicode编码,则在字符之前使用字符u进行标识 

Python序列类型之字符串详解

字符串(str)关于引号:Python中有3种引号.分为单引号.双引号.三引号.python中单引号’'和双引号""没有区别,如a=’abc’,a=’’abc’’.三引号就是连敲三次单引号,不表示字符串,它用来多行注释,并且多行注释没结束(没出现第二个三引号)可以随便换行.若引号中还要加引号需要交叉使用,即外面单引号里面双引号,外面双引号里面单引号.一对单引号或双引号加上引号内的字符就是字符串,字符串中间不可以换行,想换行显示在换行处敲一个\n. >>> a='abc

6、python基本数据类型之序列类型

前言:python的基本数据类型可以分为三类:数值类型.序列类型.散列类型,本文主要介绍序列类型及其通用操作 一.序列类型 1)字符串(str):用单引号('),双引号("),三引号(三单引号'''或三双引号""")来表示 2)列表(list):用[ ]中括号表示 3)元组(tuple):用()小括号表示 二.字符串str 1.定义 字符串定义:单引号.双引号.三引号.str() 引号都是成对出现 空字符串:s ='' (单引号对里没有任何数据) 空字符:s ='

1——数据类型和序列类型(基础)

数据类型和序列类型 数据类型 ###--数值类型--### In [1]: HY = 24 #int型 ? In [2]: HY = 2.4 #float型 ? In [3]: HY = True #bool型 ? In [4]: HY = 24j #complex型 ###--序列类型--###? In [6]: HY = [2, 4, 24] #列表(可变) ? In [7]: HY = (24, 'wum', 'mor') #元组(不可变) ? In [8]: HY = '进阶咯!6666

Python基本语法_基本数据类型_序列类型详解

目录 目录 序列 序列的标准操作符 切片操作符 一个例子 序列的功能函数 enumerate 枚举出序列对象的元素 len 获取序列对象的长度 min 取出sequence中的最小值 max 取出sequence中的最大值 reversed 返回一个逆序访问的迭代器 sorted 序列的排序 sum 计算序列中的各项元素和 zip 混合两个序列对象 all 检测sequence中各项元素是否均为True any 检测序列中的任意元素是否为True 序列 序列是一类基本数据类型(字符串/列表/元组

Python学习之通用序列类型数据详解

本文和大家分享的主要是python通用序列类型数据的相关操作,一起来看看吧,希望对大家学习python有所帮助. Python的序列,Python有6种内建的序列,包括:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.其中最为常用的是Python的列表和元组. Python的序列 Python有6种内建的序列,包括:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.其中最为常用的是Python的列表和元组. Python序列的应用 Pyt

python中非序列类型期望值拷贝的解决方案

看下面这段代码: # -*- coding: utf-8 -*-import copy class Present(object):    def __init__(self, str_cmd):        self._str_cmd = str_cmd        print "进入Present时的地址:", id(self._str_cmd) def set_value(self):        temp = "test_cmd"        sel