遍历数组
Iterating through array
我有一个布尔数组,现在我想将这些条目换成数字。
False => 0
True => 1
我写了两段不同的代码,我想知道哪一段更好,为什么。这与其说是实际解决问题,不如说是学习。
arr = [[True,False],[False,True],[True,True]]
for i,row in enumerate(arr):
for j,entry in enumerate(row):
if entry:
arr[i][j] = 1
else:
arr[i][j] = 0
print(arr)
第二种方法:
arr = [[True,False],[False,True],[True,True]]
for i in range(len(arr)):
for j in range(len(arr[i])):
if arr[i][j]:
arr[i][j] = 1
else:
arr[i][j] = 0
print(arr)
我读到有一些方法可以通过导入 itertools
或类似方法来实现。如果可以使用“机载工具”来完成,我真的不喜欢导入东西,但我应该使用它们来解决这个问题吗?
让我们定义你的数组:
>>> arr = [[True,False],[False,True],[True,True]]
现在,让我们将布尔值转换为整数:
>>> [[int(i) for i in row] for row in arr]
[[1, 0], [0, 1], [1, 1]]
或者,如果我们想更灵活地替换什么,我们可以使用三元语句:
>>> [[1 if i else 0 for i in row] for row in arr]
[[1, 0], [0, 1], [1, 1]]
如果您想继续使用 for 循环(例如因为您想改变现有数组而不是创建新数组),您应该简化代码。
我会首先通过删除索引来简化外循环(不需要它,因为它比修改嵌套数组更容易修改行):
for row in arr:
for j, entry in enumerate(row):
if entry:
row[j] = 1
else:
row[j] = 0
这些简单的 if 语句通常可以通过使用 if 表达式来简化:
row[j] = 1 if entry else 0
但在这种情况下我们可以做得更好。 bool
是 int
的子 class(即所有 bool
都是 int
),并且 True
和 False
分别定义为 1
和 0
——如果您向下滚动到 PEP 285 (https://www.python.org/dev/peps/pep-0285/) 的规范部分,您会发现这种等效性并非偶然,而是非常有设计感。
因此,我们可以使用 int
构造函数来获取基础整数值[*],因为 int(True) == 1
和 int(False) == 0
,if 表达式可以简化为:
row[j] = int(entry)
[*] 从技术上讲,这是对基础 class 的显式向上转换,而不是转换构造函数..
简化代码:
for row in arr:
for j, entry in enumerate(row):
row[j] = int(entry)
我有一个布尔数组,现在我想将这些条目换成数字。
False => 0
True => 1
我写了两段不同的代码,我想知道哪一段更好,为什么。这与其说是实际解决问题,不如说是学习。
arr = [[True,False],[False,True],[True,True]]
for i,row in enumerate(arr):
for j,entry in enumerate(row):
if entry:
arr[i][j] = 1
else:
arr[i][j] = 0
print(arr)
第二种方法:
arr = [[True,False],[False,True],[True,True]]
for i in range(len(arr)):
for j in range(len(arr[i])):
if arr[i][j]:
arr[i][j] = 1
else:
arr[i][j] = 0
print(arr)
我读到有一些方法可以通过导入 itertools
或类似方法来实现。如果可以使用“机载工具”来完成,我真的不喜欢导入东西,但我应该使用它们来解决这个问题吗?
让我们定义你的数组:
>>> arr = [[True,False],[False,True],[True,True]]
现在,让我们将布尔值转换为整数:
>>> [[int(i) for i in row] for row in arr]
[[1, 0], [0, 1], [1, 1]]
或者,如果我们想更灵活地替换什么,我们可以使用三元语句:
>>> [[1 if i else 0 for i in row] for row in arr]
[[1, 0], [0, 1], [1, 1]]
如果您想继续使用 for 循环(例如因为您想改变现有数组而不是创建新数组),您应该简化代码。
我会首先通过删除索引来简化外循环(不需要它,因为它比修改嵌套数组更容易修改行):
for row in arr:
for j, entry in enumerate(row):
if entry:
row[j] = 1
else:
row[j] = 0
这些简单的 if 语句通常可以通过使用 if 表达式来简化:
row[j] = 1 if entry else 0
但在这种情况下我们可以做得更好。 bool
是 int
的子 class(即所有 bool
都是 int
),并且 True
和 False
分别定义为 1
和 0
——如果您向下滚动到 PEP 285 (https://www.python.org/dev/peps/pep-0285/) 的规范部分,您会发现这种等效性并非偶然,而是非常有设计感。
因此,我们可以使用 int
构造函数来获取基础整数值[*],因为 int(True) == 1
和 int(False) == 0
,if 表达式可以简化为:
row[j] = int(entry)
[*] 从技术上讲,这是对基础 class 的显式向上转换,而不是转换构造函数..
简化代码:
for row in arr:
for j, entry in enumerate(row):
row[j] = int(entry)