列表的逻辑索引

新手上路,请多包涵

我有一个正在查看的程序和这一部分

temp = [1,2,3,4,5,6]
temp[temp!=1]=0
print temp

如果运行给出结果:

 [1, 0, 3, 4, 5, 6]

我需要帮助来理解导致此结果的代码中发生了什么。

原文由 user2320239 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 339
2 个回答

temp 在你的例子中是一个 list ,它显然不等于 1。因此表达式

 temp[temp != 1] = 0

实际上是

temp[True] = 0  # or, since booleans are also integers in CPython
temp[1] = 0

temp 转换为 NumPy 数组以获得所需的广播行为

>>> import numpy as np
>>> temp = np.array([1,2,3,4,5,6])
>>> temp[temp != 1] = 0
>>> temp
array([1, 0, 0, 0, 0, 0])

原文由 Sergei Lebedev 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如已经解释过的那样,您正在使用与返回 True/1 的列表进行比较的结果来设置第二个元素,因为 bool 是 int 的子类。你有一个列表而不是一个 numpy 数组,所以如果你想改变它,你需要迭代它,你可以使用 if/els e 逻辑进行列表理解:

 temp = [1,2,3,4,5,6]
temp[:] = [0 if ele != 1 else ele for ele in temp ]

这会给你:

 [1, 0, 0, 0, 0, 0]

或者使用 _生成器表达式_:

 temp[:] = (0 if ele != 1 else ele for ele in temp)

原文由 Padraic Cunningham 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题