2017-02-02 82 views
-1

嘗試將1/0列表轉換爲布爾列表。python:將1/0s列表轉換爲布爾值列表

bool([1,0,1,0])似乎不起作用。 [1,0,1,0] == 1不起作用。

有沒有另一種方法(希望非列表理解)?

+3

這似乎是一個XY的問題,是有東西,你實際上是想既然你解決可以使用1和0作爲布爾值,它仍然可以工作... – MooingRawr

+0

爲什麼你不想使用列表理解? – BrenBarn

+0

後人:[Python 3.5.2](https://repl.it/F5K7/2)和[Python 2.7.10](https://repl.it/F5K4/1)各種答案之間的速度比較,按性能排序。 – TemporalWolf

回答

5

在Python 2

bool_list = map(bool,int_list) 

在Python 3:

bool_list = list(map(bool,int_list)) 
+3

可能值得注意的是'map'不會返回Python 3中的列表。 – Sayse

+1

是的。謝謝@Sayse –

1

試試這個,應用列表解析:

lst = [1, 0, 1, 0] 
[bool(x) for x in lst] 
=> [True, False, True, False] 
2
[x==1 for x in list] 

是一種通用的方法,你可以很容易地適應你應該有一個列表ent不是01

+0

這是迄今爲止已經發布的最快速的方法:根據timeit,'map()'爲0.31秒和'bool()'爲0.60秒 – TemporalWolf

+0

@TemporalWolf我不相信。 – miradulo

+0

@Mitch然後你自己運行timeit。即使是廣義的'timeit.timeit(「[對於第一個x不是x == 0],」lst = [1,0,1,0]「)''在'bool()'版本的一半時間內運行(它會將所有的int轉換爲bools)。 – TemporalWolf

1

使用numpy模塊解決方案:

import numpy as np 

l = np.array([1,0,1,0]) 
print((l > 0).tolist()) 

輸出:

[True, False, True, False] 

l > 0 - 數組l的每個元件進行測試,如果它比0更大。多維數組打交道時,這些測試的結果是結果陣列


這種方法的布爾元素也相當不錯:

l = np.array([[1,0,1,0], [1,1,1,1], [0,0,1,0]]) 
print((l > 0).tolist()) 

輸出:

[[True, False, True, False], [True, True, True, True], [False, False, True, False]] 
0

在可讀性方面,bool()map()是更好的選擇。在速度方面,他們大約一半的速度:

對於Python 3.5.2(repl.it):

[not not x for x in lst]

比其他三個選項更快,雖然只是略快於

[x==1 for x in lst]

對於Python 2.7.10(repl.it):

x==1退出not not,但兩者仍然是其他兩個快兩倍。


not not也有優勢在x==1這將適用於所有的價值觀,而不僅僅是01