簡體   English   中英

迭代數組

[英]Iterating through array

我有一系列bools,現在我想將這些條目換成數字。

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

但在這種情況下,我們可以做得更好。 boolint的子類(即所有bool都是int的),而TrueFalse分別定義為10 - 如果向下滾動到PEP 285的規范部分( https:// www.python.org/dev/peps/pep-0285/ )你會發現這種等價不是偶然的,而是非常多的設計。

因此我們可以使用int構造函數來獲取底層整數值[*],因為int(True) == 1int(False) == 0 ,if-expression可以簡化為:

row[j] = int(entry)

[*]從技術上講,這是對基類的顯式向上轉換,而不是轉換構造函數。

簡化代碼:

for row in arr:
    for j, entry in enumerate(row):
        row[j] = int(entry)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM