python - 如何修复for循环的输出列表始终将最后一个索引的最后一个值存储在python中
问题描述
我尝试从名为 date_range 的数据列表中存储 weekofyear 的数量,该列表存储了诸如
date_range[1] = DatetimeIndex(['2020-03-02', '2020-03-03', '2020-03-04', '2020-03-05', '2020-03-06', '2020-03-07', '2020-03-08', '2020-03-09', '2020-03-10', '2020-03-11', '2020-03-12', '2020-03-13', '2020-03-14', '2020-03-15', '2020-03-16', '2020-03-17', '2020-03-18', '2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22', '2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26', '2020-03-27', '2020-03-28', '2020-03-29', '2020-03-30', '2020-03-31', '2020-04-01', '2020-04-02', '2020-04-03', '2020-04-04', '2020-04-05'], dtype='datetime64[ns]', freq='D')
通过使用以下代码
weeknumber = [[0]*35]*2
for i in range(28):
for j in range(35)):
weeknumber[i][j]= pd.Timestamp(date_range[i][j]).weekofyear
但是,所有 28 行的结果都存储了这样的最后结果pd.Timestamp(date_range[28]).weekofyear
所以
,如何修复它。
解决方案
0
是一个int
对象(在 Python 中,一切都是对象,记住)。让我们将此int
对象称为“ZERO_OBJECT”。[0]
是具有一个元素的列表对象,并且该元素是对“ZERO_OBJECT”的引用。让我们将此列表对象称为“LIST_1”[0]*35
创建另一个列表对象,由对相同 “ZERO_OBJECT”的35
引用组成。(这就是运算符在 Python 中的工作方式)。我们称这个新的列表对象为“LIST_2”*
[[0]*35]
是另一个具有一个元素的列表对象,并且该元素是对上述对象“LIST_2”的引用。我们称这个新的列表对象为“LIST_3”[[0]*35]*28
创建另一个列表对象,由28
元素组成,但这些28
元素中的每一个都是对同一对象“LIST_3”的引用。正如我上面所说,这就是*
运营商的工作方式。(并且您认为这些28
元素是对“LIST_3”的独立副本的引用)。这绝对不是你想要的。因为,当您更新对“LIST_3”的一个引用时,您会看到它反映在对“LIST_3”的所有其他引用中。
要解决此问题,请使用以下代码:
weeknumber = []
for i in range(28):
weeknumber.append([])
for j in range(35)):
weeknumber[i].append(pd.Timestamp(date_range[i][j]).weekofyear)
推荐阅读
- c++ - 为什么运算符重载上的 ref-qualifier 和 cv-qualifier 允许右值赋值?
- javascript - 我的路线没有按照我希望的方式工作
- java - 如何在不单击每个方块的情况下使绿色框填满整个屏幕?
- python - Amazon SageMaker 如何预测新数据
- z3py - 将变量限制在 z3 中的域中
- python - 从另一个模块导入的 Python 脚本
- javascript - 如何在 React 中使用 useLongPress.js 从 {...bind} 将参数传递给 onCancel?
- reactjs - React Redux 错误:操作必须是普通对象。使用自定义中间件进行异步操作
- amazon-web-services - 为循环创建的一个资源指定参数 - Terraform
- java - 启动默认 SMS 应用程序将我发送到系统跟踪菜单