Python 遍历数组
我有一个布尔数组,现在我想把这些条目换成数字Python 遍历数组,python,arrays,python-3.x,swap,Python,Arrays,Python 3.x,Swap,我有一个布尔数组,现在我想把这些条目换成数字 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
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循环(例如,因为您想改变现有数组而不是创建新数组),那么应该简化代码 我首先通过删除索引来简化外部循环(不需要它,因为修改行比修改嵌套数组更容易): 这些简单的if语句通常可以通过使用if表达式来简化:
row[j] = 1 if entry else 0
但在这种情况下,我们可以做得更好bool
是int
的一个子类(即所有bool
都是int
),True
和False
分别定义为1
和0
,如果您向下滚动到PEP 285()你会发现这种等价性不是偶然的,而是设计的
因此,我们可以使用int
构造函数获取底层整数值[*],因为int(True)==1
和int(False)==0
,if表达式可以简化为:
row[j] = int(entry)
[*]从技术上讲,这是基类的显式向上转换,而不是转换构造函数
简化代码:
for row in arr:
for j, entry in enumerate(row):
row[j] = int(entry)
绝对是方案A;迭代
范围(len(…)
不是pythonic。非常感谢。这就是我一直在寻找的答案!比我更优雅的是,我刚刚做了[(lambda x:[int(y)代表y in x])(I)代表I in foo]
-我说不出为什么我的大脑会如此困难地关闭,我不只是做了你做的事情:)周五的结束时间可能是int(bool(I))
而不是三元数?John1024。非常感谢您在最后一部分添加内容。因为以后我可能想用一些其他符号来代替1和0:D
for row in arr:
for j, entry in enumerate(row):
row[j] = int(entry)