流畅的Python 2. 数据结构 - 序列构成的数组

文章目录

    • 1. 内置序列
    • 2. 列表推导 []、生成器() 表达式
    • 3. 元组 tuple
    • 4. 切片
    • 5. `+, *` 操作
    • 6. 增量赋值
    • 7. 排序
    • 8. bisect管理已排序序列
      • 8.1 用 bisect.bisect 二分搜索
      • 8.2 用 bisect.insort 二分插入新元素
    • 9. 列表的替代
      • 9.1 数组
      • 9.2 内存视图
      • 9.3 NumPy、SciPy
      • 9.4 队列

1. 内置序列

  • 容器序列:list, tuple, collections.deque 能存放不同类型的数据,存放的是对象的引用
  • 扁平序列:str, bytes, bytearray, memoryview, array.array 只能存一种类型,存放的是(只能存字符、字节、数值这种基础类型)

按照是否可修改:

  • 可变序列:list,bytearray,array.array,collections.deque,memoryview
  • 不可变序列:tuple, str, bytes

2. 列表推导 []、生成器() 表达式

  • 列表推导有自己的局部作用域
# 列表推导有自己的局部作用域
x = "ABC"
y = [ord(x) for x in x]
print(x)  # ABC, x 没有被覆盖
print(y)  # [65, 66, 67]
  • 列表推导式,只能生成列表类型
# 列推导更简单
symbols = '$¢£¥€¤'
beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
print(beyond_ascii)  # [162, 163, 165, 8364, 164]
beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))
print(beyond_ascii)  # [162, 163, 165, 8364, 164]# 注意以下两个for的顺序,先出现的变量,先遍历完它的组合
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
t_shirts = [(color, size) for color in colors for size in sizes]
print(t_shirts)
# [('black', 'S'), ('black', 'M'), ('black', 'L'),
# ('white', 'S'), ('white', 'M'), ('white', 'L')]t_shirts = [(color, size) for size in sizes for color in colors]
print(t_shirts)
# [('black', 'S'), ('white', 'S'),
# ('black', 'M'), ('white', 'M'),
# ('black', 'L'), ('white', 'L')]

生成器表达式

  • 逐个的产出元素,背后遵守了迭代器协议,相比 列表 去初始化其他类型,生成器表达式 更节省内存,它不会一次性产生全部的组合
  • 语法跟列表推导差不多,把 [ ] 改成 ( )
# 生成器表达式 ()
symbols = '$¢£¥€¤'
print(tuple(ord(symbol) for symbol in symbols))
import arrayprint(array.array('I', (ord(symbol) for symbol in symbols)))
# ord(symbol) 外面需要括号,因为array需要2个构造参数
# typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)for t_shirt in ('{}, {}'.format(c, s) for c in colors for s in sizes):print(t_shirt)
# black, S
# black, M
# black, L
# white, S
# white, M
# white, L

3. 元组 tuple

  • 不可变的列表
  • 还可用于 没有字段名的记录
lax_coordinates = (33.9425, -118.408056)
city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
for passport in sorted(traveler_ids):print('{}/{}'.format(passport[0], passport[1]))print('%s/%s' % passport)  # 跟上面的等价, % 运算符把对应元素对应到 %s 处
  • 元组拆包 %, = 必须保证两侧的元素数量一样,不一样多,可以使用 * 忽略多余元素
lax_coordinates = (33.9425, -118.408056)
latitude, longitude = lax_coordinates  # 元组拆包
print(latitude, longitude)  # 33.9425 -118.408056a, b = 1, 2
a, b = b, a
print(a, b)  # 2 1print(divmod(20, 8))  # (2, 4)
t = (20, 8)
print(divmod(*t))  # *运算符把可迭代对象拆开作为函数的参数
# (2, 4)
quotient, remainder = divmod(*t)
print(quotient, remainder)  # 2 4import os
path, filename = os.path.split("c:/abd/tuple.py")
print(path)  # c:/abd
print(filename)  # tuple.py
  • * 代替多个元素
a, b, *rest = range(5)
print(a, b, rest)  # 0 1 [2, 3, 4]
a, b, *rest = range(3)
print(a, b, rest)  # 0 1 [2]
a, b, *rest = range(2)  # 不能少于两个元素
print(a, b, rest)  # 0 1 []a, *body, c, d = range(5)
print(a, body, c, d)  # 0 [1, 2] 3 4
*head, b, c, d = range(5)
print(head, b, c, d)  # [0, 1] 2 3 4
  • 嵌套元组拆包
metro_areas = [('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]print('{:>15} | {:<9} | {:^9}'.format('table', 'lat.', 'long.'))
# < 左对齐(默认),^居中对齐 > 右对齐
fmt = '{:15} | {:9.3f} | {:9.4f}'  # w宽度.n小数点位数
for name, cc, pop, (latitude, longitude) in metro_areas:if longitude <= 0:print(fmt.format(name, latitude, longitude))
#           table | lat.      |   long.  
# Mexico City     |    19.433 |  -99.1333
# New York-Newark |    40.809 |  -74.0204
# Sao Paulo       |   -23.548 |  -46.6358
  • 有名字的元组 collections.namedtuple ,构建一个带字段名的元组和一个有名字的类
  • 其构建的实例比普通对象小一些,因为它不会用 __dict__ 来存放属性
from collections import namedtupleCity = namedtuple('City', 'name country population coordinates')
#                  类名,   各个字段名字(数个字符串的可迭代对象 or 空格分割的字符串)
tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))  # 只接受单一可迭代对象
print(tokyo)
print(tokyo.population)  # 通过字段名获取属性
print(tokyo.coordinates)
print(tokyo[1])  # 通过位置获取属性print(City._fields)  # 类的所有字段名 ('name', 'country', 'population', 'coordinates')
LatLong = namedtuple('LatLong', 'lat long')
delhi_data = ('Delhi NCR', 'IN', 21.935, LatLong(28.613889, 77.208889))
delhi = City._make(delhi_data) # 生成类的实例 跟 City(*delhi_data) 一样
print(delhi._asdict()) # 以collections.OrderedDict的形式返回
for k, v in delhi._asdict().items():print(k + ':', v)

4. 切片

list, tuple, str 等序列类型都支持切片

  • seq[start:stop:step] 从 start 开始,到 stop(不包含)结束,每间隔 step 个取一次,其调用seq.__getitem__(slice(start, stop, step))
# slice
invoice = """
1909  Pimoroni PiBrella       $17.50 3 $52.50
1489  6mm Tactile Switch x20  $4.95  2 $9.90
1510  Panavise Jr. - PV-201   $28.00 1 $28.00
1601  PiTFT Mini Kit 320x240  $34.95 1 $34.95
"""
SKU = slice(0, 6)
DESCRIPTION = slice(6, 30)
UNIT_PRICE = slice(30, 37)
QUANTITY = slice(37, 39)
ITEM_TOTAL = slice(39, None)
line_items = invoice.split('\n')[1:]
for item in line_items:print(item[UNIT_PRICE], item[DESCRIPTION])
# $17.50  Pimoroni PiBrella       
# $4.95   6mm Tactile Switch x20  
# $28.00  Panavise Jr. - PV-201   
# $34.95  PiTFT Mini Kit 320x240  
  • 给切片赋值(迭代对象),就地修改
# 给切片赋值, 就地修改
l = list(range(10))
print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l[2:5] = [20, 30]  # 替换原list
print(l)  # [0, 1, 20, 30,  5, 6, 7, 8, 9]
del l[5 : 7] # 删除段
print(l)  # [0, 1, 20, 30, 5, 8, 9]
l[3::2] = [11, 22]
print(l)  # [0, 1, 20, 11, 5, 22, 9]
# l[2:5] = 100 # Error can only assign an iterable

5. +, * 操作

  • 使用 + * ,拼接,产生新的序列
  • 注意 不要在 [[list]]*n 外侧乘以 n ,它们 n 个都指向同一个list
# * + 操作
l = [1, "abc", 3]
print(2 * l)  # [1, 'abc', 3, 1, 'abc', 3]
print(l)  # [1, 'abc', 3]
s = "abc"
print(s * 2)  # abcabc
print(s)  # abc# 注意,坑点
l = [[1, 2, 3]] * 3
print(l)  # [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
l[0][0] = 100  # 内部都是指向一个列表
print(l)  # [[100, 2, 3], [100, 2, 3], [100, 2, 3]]# 正确写法
l = [[1, 2, 3] for i in range(3)]
print(l)  # [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
l[0][0] = 100
print(l)  # [[100, 2, 3], [1, 2, 3], [1, 2, 3]]

6. 增量赋值

  • +=,*= 等,+= 背后对应于 __iadd__() 就地加法,如果类没有实现这个方法,会调用 __add__()
# 增量操作
l = [1, 2, 3]
print(id(l))  # 2408644481736
l *= 2
print(l)  # [1, 2, 3, 1, 2, 3]
print(id(l))  # 2408644481736 , 就地修改t = (1, 2, 3)
print(id(t))  # 1930961968224
t *= 2
print(t)  # (1, 2, 3, 1, 2, 3)
print(id(t))  # 1930959535464 , 不可变对象,会产生新的对象(str例外)

7. 排序

  • list.sort() 就地排序,返回 None,没有复制
  • 内置函数 sorted() ,会新建一个列表返回
  • 都有关键字,reverse 默认False升序, key排序函数(自定义,lenstr.lower

8. bisect管理已排序序列

8.1 用 bisect.bisect 二分搜索

def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):i = bisect.bisect(breakpoints, score)# bisect同bisect_right,相等的话返回后面的位置return grades[i]ans = [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
# bisect_left                  ['F', 'A', 'C', 'D', 'B', 'B', 'A']
# bisect_right                 ['F', 'A', 'C', 'C', 'B', 'A', 'A']
print(ans)

8.2 用 bisect.insort 二分插入新元素

insort(seq, item) 把变量 item 插入到序列 seq 中,并能保持 seq 的升序顺序

import random, timerandom.seed(time.time())
l = []
for i in range(7):new_item = random.randrange(20)bisect.insort(l, new_item)print('{:2} ->'.format(new_item), l)
# 17 -> [17]
#  0 -> [0, 17]
# 16 -> [0, 16, 17]
#  6 -> [0, 6, 16, 17]
# 13 -> [0, 6, 13, 16, 17]
# 14 -> [0, 6, 13, 14, 16, 17]
#  1 -> [0, 1, 6, 13, 14, 16, 17]

9. 列表的替代

9.1 数组

  • 只包含数字的列表,array.arraylist 更高效,支持所有可变序列的操作
  • 还可以 从文件读取 和 存入文件,.frombytes.tofile
# 数组
from array import array
from random import randomfloats = array('d', (random() for i in range(10 ** 7)))
print(floats[-1]) # 0.7284759170264468
f = open("floats.bin", "wb")
floats.tofile(f)
f.close()
floats1 = array('d')
f = open("floats.bin", "rb")
floats1.fromfile(f, 10 ** 7)
f.close()
print(floats[-1]) # 0.7284759170264468
print(floats == floats1) # True

pickle.dump 几乎可以处理所有内置数字类型(复数,嵌套集合,自定义类)

9.2 内存视图

  • 不复制,操作内容
# 内存视图
nums = array('h', [-2, -1, 0, 1, 2]) # h 短整型有符号
menv = memoryview(nums)
print(len(menv)) # 5
print(menv[0]) # -2
menv_oct = menv.cast('B') # B 无符号字符
print(menv_oct.tolist()) # [254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
menv_oct[5] = 4 # 操作位置上的字节
print(nums) # array('h', [-2, -1, 1024, 1, 2])

9.3 NumPy、SciPy

9.4 队列

  • 列表在 头部 pop,或者 insert 时,比较费时,会移动元素
  • collections.deque 类(双向队列)是一个线程安全、可以快速从两端添加或者删除元素的数据类型
# deque
from collections import dequedq = deque(range(10), maxlen=10)
print(dq)  # deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
dq.rotate(3)  # 右移3个
print(dq)  # deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
dq.rotate(-4)  # 左移4个
print(dq)  # deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], maxlen=10)
dq.appendleft(-1)
print(dq)  # deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
dq.extend([11, 22, 33])  # 满了,删除另一端的
print(dq)  # deque([3, 4, 5, 6, 7, 8, 9, 11, 22, 33], maxlen=10)
dq.extendleft([10, 20, 30, 40]) # 逐个添加到左侧
print(dq)  # deque([40, 30, 20, 10, 3, 4, 5, 6, 7, 8], maxlen=10)
  • 还有一些 PriorityQueueQueueLifoQueueheapq等队列

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

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

相关文章

hadoop 多机全分布式安装步骤(虚拟机1master+2slave)

文章目录1. 虚拟机安装Centos72. 配置静态IP3. 更改主机名4. 编辑域名映射5. 安装配置Java6. 配置SSH免密登录7 .安装Hadoop8. 关闭防火墙9. 格式化文件系统10. 启动验证11. 第一个MapReduce程序: WordCount12. 关闭Hadoop参考书&#xff1a;《Hadoop大数据原理与应用》1. 虚拟…

ie浏览器模拟器_航空飞机模拟器安卓版下载-航空飞机模拟器游戏下载

3D建模射击&#xff0c;真实的飞行世界&#xff0c;在航空飞机模拟器游戏中玩家将化身为飞行员&#xff0c;这里的飞机类型非常齐全&#xff0c;每一辆都要熟练操作&#xff0c;最大程度还原了飞行员最真实的驾驶场景&#xff0c;完成任务获得奖励还能提高它的性能哦&#xff0…

npm安装vue_vue搭建脚手架的方式

基于window系统整理的vue脚手架npm、yarn安装方法&#xff0c;记得网络一定要好先说npm的安装方法先在需要创建项目的文件夹下打开终端&#xff0c;如果没有node可以先去官网下载&#xff0c;然后一路next&#xff0c;就OK&#xff0c;记得看清楚电脑操作系统是64还是32&#x…

《BI那点儿事》运用标准计分和离差——分析三国超一流统帅综合实力排名 绝对客观,数据说话...

数据分析基础概念&#xff1a;标准计分&#xff1a; 1、无论作为变量的满分为几分&#xff0c;其标准计分的平均数势必为0&#xff0c;而其标准差势必为1。2、无论作为变量的单位是什么&#xff0c;其标准计分的平均数势必为0&#xff0c;而其标准差势必为1。公式为&#xff1a…

天池 在线编程 最佳利用率(二分查找 + 哈希)

文章目录1. 题目2. 解题1. 题目 给两个排序的数组。 从两个数组中各取取一个数&#xff0c;这两个数之和需要小于或等于k&#xff0c; 需要找到两数之和最大的索引组合。 返回一对包含两个列表的索引。 如果有多个两数之和相等的索引答案&#xff0c;你应该选择第一个数组索引…

python re 匹配多行_Python正则表达式,看这一篇就够了

作者 | 猪哥来源 | 裸睡的猪(ID: IT--Pig)大多数编程语言的正则表达式设计都师从Perl&#xff0c;所以语法基本相似&#xff0c;不同的是每种语言都有自己的函数去支持正则&#xff0c;今天我们就来学习 Python中关于 正则表达式的函数。re模块主要定义了9个常量、12个函数、1个…

nsga2算法_用遗传算法进行容量管理 让虚拟机放置策略更优

随着互联网技术的高速发展&#xff0c;云计算已经成为各行各业的“水电煤”&#xff0c;成为“互联网”的基础设施&#xff0c;而数据中心则是云服务背后的刚性保障。无论是传统的数据中心&#xff0c;还是云形态的数据中心&#xff0c;虚拟化技术都是提升其资源利用率、降低管…

php预处理_如何用预处理让 PHP 更先进

原标题&#xff1a;如何用预处理让 PHP 更先进先来点趣事。不久以前&#xff0c; 来添加 Python 的 range 语法。然后&#xff0c; 大虾 &#xff0c;并且 建议为 PHP 添加 C# 风格的 getter 和 setter。我意识到对于一个局外人来说&#xff0c;建议和实现新的语言特性是件缓慢…

天池 在线编程 两句话中的不常见单词(哈希计数)

文章目录1. 题目2. 解题1. 题目 给定两个句子 A 和 B 。 &#xff08;句子是一串由空格分隔的单词。每个单词仅由小写字母组成。&#xff09; 如果一个单词在其中一个句子中只出现一次&#xff0c;在另一个句子中却没有出现&#xff0c;那么这个单词就是不常见的。 返回所有…

iphone屏幕上的圆圈怎么设置_iPhone手机屏幕突然变暗或者黑屏怎么办?看这里你就知道该怎么办...

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到各种有关娱乐的文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

C语言库函数大全及应用实例六

C语言库函数大全及应用实例六 原文:C语言库函数大全及应用实例六[编程资料]C语言库函数大全及应用实例六函数名: getlinesettings 功 能: 取当前线型、模式和宽度 用 法: void far getlinesettings(struct linesettingstype far *lininfo): 程序例: <?xml:namespace prefix…

天池 在线编程 最小的行程(动态规划)

文章目录1. 题目2. 解题1. 题目 给定一个二维矩阵&#xff0c;找到从上到下的最小路径。只能向左下&#xff0c;下&#xff0c;右下移动 所有的元素都是正整数 矩阵大小 < 200x200 样例 1: 输入: 1 2 3 4 5 6 7 8 9 输出: 12 解释: 最短的路径为:1->4->7, 返回12.样…

fluent瞬态计算终止条件在哪里设置_Fluent案例7【圆柱绕流】

一个瞬态的圆柱绕流案例知识点&#xff1a;瞬态圆柱绕流的模拟一个后处理的方法&#xff1a;将瞬态模型中一个点的速度变化绘成图表并将数值导出excel文件模型如下图所示&#xff0c;左边界为速度边界进口速度0.5m/s&#xff0c;试模拟出计算域中的速度变化打开workbench&#…

qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...

对于很多刚进入测试行业的新手来说&#xff0c;由于自身的工作经验不足&#xff0c;虽有测试基础知识傍身&#xff0c;但仍然很难将测试用例写的尽善尽美。因此&#xff0c;学习别人的测试经验&#xff0c;将是你成为测试达人的必经之路。今天&#xff0c;我们就以QQ邮箱为例&a…

LeetCode 878. 第 N 个神奇数字(二分查找)

文章目录1. 题目2. 解题1. 题目 如果正整数可以被 A 或 B 整除&#xff0c;那么它是神奇的。 返回第 N 个神奇数字。由于答案可能非常大&#xff0c;返回它模 10^9 7 的结果。 示例 1&#xff1a; 输入&#xff1a;N 1, A 2, B 3 输出&#xff1a;2示例 2&#xff1a; 输…

为什么百度统计里面的广告那么多_里面东西一模一样的桶装方便面为什么比袋装贵那么多?...

今天特地买了一桶桶装的和一袋袋装的&#xff0c;同品牌同系列同口味&#xff0c;里面面饼&#xff0c;配料包也一模一样&#xff0c;桶装的只是多了一个小勺子&#xff0c;为什么一袋二元五&#xff0c;一桶就要卖4元&#xff1f;并且大家好像都不觉得有什么不妥……(好吧我就…

LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等

文章目录1. 题目2. 解题1. 题目 给你长度相等的两个字符串 s1 和 s2 。 一次 字符串交换 操作的步骤如下&#xff1a;选出某个字符串中的两个下标&#xff08;不必不同&#xff09;&#xff0c;并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交换…

gradle 上传jar包_Gradle学习记录014 关于依赖的声明

详细学习Gradle构建的依赖声明。该学习记录基于Gradle官方网站资料。本篇参考链接如下&#xff1a;https://docs.gradle.org/current/userguide/declaring_dependencies.html声明一个模块作为依赖通常声明一个模块作为依赖&#xff0c;需要指定这个模块的版本。Gradle提供了一套…

win10版本查看_想知道电脑中安装的win10版本号,用这3招就对了,一键查看

自从微软在Windows 10中更改了发布模型后&#xff0c;很多用户就对找出他们在电脑上安装的Windows 10版本感兴趣。大家可能都已经知道&#xff0c;微软不会再发布Windows的主要版本&#xff0c;而是会不断发布更新&#xff0c;这让人想起许多Linux发行版的滚动发行模型。如果你…

LeetCode 1791. 找出星型图的中心节点(图出入度)

文章目录1. 题目2. 解题1. 题目 有一个无向的 星型 图&#xff0c;由 n 个编号从 1 到 n 的节点组成。 星型图有一个 中心 节点&#xff0c;并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。 给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示在节…