python 如何快速复制序列

1 基本用法

把序列乘以一个整数,就会产生一个新序列。这个新序列是原始序列复制了整数份,然后再拼接起来的结果。

l=[1,2,3]
l2=l * 3
logging.info('l2 -> %s',l2)
l3=5 * 'deniro'
logging.info('l3 -> %s',l3)

运行结果:

INFO - l2 -> [1, 2, 3, 1, 2, 3, 1, 2, 3]
INFO - l3 -> denirodenirodenirodenirodeniro

* 复制语法不会修改原有的操作对象,而是构建出一个全新的序列。

2 列表陷阱

a * n 语法中,a 为列表,n 为需要复制的列表数。如果 a 列表中的元素是基本类型的话,没什么问题。但如果 a 列表中的元素是对象的引用的话,那么这些复制出来的列表中的引用其实指向的是同一个引用。

Luciano Ramalho 举了一个井字棋示例。

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

(1)错误示例 1

weird_board = [['_'] * 3] * 3
logging.info('weird_board -> %s', weird_board)
weird_board[1][2] = 'X'
logging.info('weird_board -> %s', weird_board)

运行结果:
INFO - weird_board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
INFO - weird_board -> [['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

可以看到虽然代码中只修改了 [1][2] 位置的值,但却影响到了三处地方。这就说明这三处其实指向的是同一个引用。

(2)错误示例 2

这个示例犯的错与前一个示例相同,都是把同一个对象追加到同一块游戏板中(board)。

row = ['_'] * 3
board = []
for i in range(3):
  board.append(row)
logging.info('board -> %s', board)
board[1][2] = 'X'
logging.info('board -> %s', board)

运行结果:

INFO - board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
INFO - board -> [['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

(3)正确示例

对示例 2 进行改造,就可以避免上述问题。

board = []
for i in range(3):
  row = ['_'] * 3
  board.append(row)
logging.info('board -> %s', board)
board[1][2] = 'X'
logging.info('board -> %s', board)

运行结果:

INFO - board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
INFO - board -> [['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

这里把 row = ['_'] * 3 放入 for 循环中,这样每一次循环都会新建一个 row,然后再放入游戏板中。这样游戏板中的每一个单元格都是独立的,互不影响。

利用列表推导方法,还可以简化示例代码:

board = [['_'] * 3 for i in range(3)]
logging.info('board -> %s', board)

board[1][2] = 'X'
logging.info('board -> %s', board)

以上就是python 如何快速复制序列的详细内容,更多关于python 复制序列的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅析Python 序列化与反序列化

    序列化是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态(存在内存中)写入到临时或持久性存储区(硬盘).以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 实现对象的序列化和反序列化在python中有两种方式:json 和 pickle. 其中json用于字符串 和 python数据类型间进行转换,pickle用于python特有的类型 和 python的数据类型间进行转换,pickle是python特有的. 1.JSON序列化:json.dump

  • Python序列化pickle模块使用详解

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,loads,load pickle提供四个功能:dumps,dump,loads,load pickle可以存储什么类型的数据呢? 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None. 由任何原生类型组成的列表,元组,字典和集合. 函数,类,类的实例 pickle模块中

  • 利用python实现平稳时间序列的建模方式

    一.平稳序列建模步骤 假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模.建模的基本步骤如下: (1)求出该观察值序列的样本自相关系数(ACF)和样本偏自相关系数(PACF)的值. (2)根据样本自相关系数和偏自相关系数的性质,选择适当的ARMA(p,q)模型进行拟合. (3)估计模型中位置参数的值. (4)检验模型的有效性.如果模型不通过检验,转向步骤(2),重新选择模型再拟合. (5)模型优化.如果拟合模型通过检验,仍然转向不走(2),充分考虑

  • 详解用Python进行时间序列预测的7种方法

    数据准备 数据集(JetRail高铁的乘客数量)下载. 假设要解决一个时序问题:根据过往两年的数据(2012 年 8 月至 2014 年 8月),需要用这些数据预测接下来 7 个月的乘客数量. import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv('train.csv') df.head() df.shape 依照上面的代码,我们获得了 2012-2014 年两年每个小时的乘

  • 如何利用python进行时间序列分析

    题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别感谢顾志耐和散沙,让我喜欢上了python. 什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值.在这里需要强调一点的是,时间序列分析并不是关于时间的回归,它主要是研究自身的变化规律的(这里不考虑含外生变量的时间序列). 为什么用python

  • Python要求O(n)复杂度求无序列表中第K的大元素实例

    昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了...感觉应该刷一波Leecode冷静下...今天抽空看下. 题目就是要求O(n)复杂度求无序列表中第K的大元素 如果没有复杂度的限制很简单...加了O(n)复杂度确实有点蒙 虽然当时面试官说思路对了,但是还是没搞出来,最后面试官提示用快排的思想 主要还是设立一个flag,列表中小于flag的组成左列表,大于等于flag的组成右列表,主要是不需要在对两侧列表在进行排序了,只需要生成左右列表就行,所以可以实现复杂度O(n). 举个例子

  • 使用python实现时间序列白噪声检验方式

    白噪声检验也称为纯随机性检验, 当数据是纯随机数据时,再对数据进行分析就没有任何意义了, 所以拿到数据后最好对数据进行一个纯随机性检验 acorr_ljungbox(x, lags=None, boxpierce=False) # 数据的纯随机性检验函数 lags为延迟期数,如果为整数,则是包含在内的延迟期数,如果是一个列表或数组,那么所有时滞都包含在列表中最大的时滞中 boxpierce为True时表示除开返回LB统计量还会返回Box和Pierce的Q统计量 返回值: lbvalue:测试的统

  • python实现时间序列自相关图(acf)、偏自相关图(pacf)教程

    自相关图是一个平面二维坐标悬垂线图.横坐标表示延迟阶数,纵坐标表示自相关系数 偏自相关图跟自相关图类似, 横坐标表示延迟阶数,纵坐标表示偏自相关系数 自相关图与偏自相关图的python代码实现: from statsmodels.graphics.tsaplots import plot_acf, plot_pacf plot_acf(b.salesVolume) plot_pacf(b.salesVolume) 可以看到,这个数据是偏自相关系数拖尾,自相关系数截尾的数据 补充知识:python

  • Python求两个字符串最长公共子序列代码实例

    一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二.算法求解 这是一个动态规划的题目.对于可用动态规划求解的问题,一般有两个特征:①最优子结构:②重叠子问题 ①最优子结构 设X=(x1,x2,...,xn)和Y=(y1,y2,...,ym)是两个序列,将X和Y的最长公共子序列记为LCS(X,Y) 找出LCS(X

  • Python如何根据时间序列数据作图

    本例子程序展示了长白山火山气体地球化学2002年观测数据中CO2和He两种气体元素深度的时间序列.程序中用到了常用的时间序列python数据处理方法,箭头标识方法,适合学习基本python作图学习使用.程序中所用到的no09.csv数据样式如下: 代码如下 import pandas as pd import matplotlib.pyplot as plt import datetime df = pd.read_csv('no09.csv') t = df.iloc[0:200, 0] t

随机推荐