迭代数组

时间:2015-10-31 00:21:51

标签: python arrays python-3.x swap

我有一系列bool,现在我想将这些条目换成数字。

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或类似内容。如果可以使用“板载工具”进行操作,我真的不喜欢导入东西,但我是否应该使用它们来解决这个问题呢?

2 个答案:

答案 0 :(得分:11)

让我们定义你的数组:

>>> 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]]

答案 1 :(得分:4)

如果你想继续使用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

但在这种情况下我们可以做得更好。 boolint的子类(即所有bool都是int' s),True和{{ 1}}分别被定义为False1 - 如果向下滚动到PEP 285(https://www.python.org/dev/peps/pep-0285/)的规范部分,您会看到等效性是不是偶然的,而是非常多的设计。

因此我们可以使用0构造函数来获取基础整数值[*],因为intint(True) == 1,if-expression可以简化为:

int(False) == 0

[*]从技术上讲,这是对基类的显式向上转换,而不是转换构造函数。

简化代码:

row[j] = int(entry)