Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 遍历数组_Python_Arrays_Python 3.x_Swap - Fatal编程技术网

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)