簡體   English   中英

"使用 any() 和 all() 檢查列表是否包含一組值或另一個"

[英]Using any() and all() to check if a list contains one set of values or another

我的代碼用於井字游戲並檢查平局狀態,但我認為這個問題在一般意義上可能更有用。

我有一個代表董事會的列表,它看起來像這樣:

board = [1,2,3,4,5,6,7,8,9]

通常來說,一般來說:

allany是接受一些可迭代並返回True的函數,如果

  • all()的情況下,iterable 中沒有任何值是虛假的;
  • any()的情況下,至少有一個值是真實的。

bool(x) == False時,值x是假的。 如果bool(x) == True ,值x是真實的。

可迭代對象中的任何非布爾值都可以—— bool(x)將根據以下規則映射(或強制,如果您願意)任何x00.0None[]()[]set() , 和其他空集合被映射到False ,其他任何東西到True bool的文檔字符串使用術語 'true'/'false' 表示 'truthy'/'falsy',使用True / False表示具體的布爾值。


在您的特定代碼示例中:

您誤解了這些功能的工作原理。 因此,以下內容完全不是您想的那樣:

if any(foobars) == big_foobar:

...因為any(foobars)將首先被評估為TrueFalse ,然后將該布爾值與big_foobar進行比較,這通常總是給你False (除非big_foobar碰巧是相同的布爾值)。

注意: iterable 可以是一個列表,但它也可以是一個生成器/生成器表達式(≈ 懶惰評估/生成的列表)或任何其他迭代器。

你想要的是:

if any(x == big_foobar for x in foobars):

它基本上首先構造一個產生一系列布爾值的迭代 - 對於foobars中的每個項目,它將項目與big_foobar進行比較,並將結果布爾值發送到結果序列中:

tmp = (x == big_foobar for x in foobars)

然后any遍歷tmp中的所有項目,並在找到第一個真實元素后立即返回True 就好像您執行了以下操作:

In [1]: foobars = ['big', 'small', 'medium', 'nice', 'ugly']                                        

In [2]: big_foobar = 'big'                                                                          

In [3]: any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, 'nice' == big_foobar, 'ugly' == big_foobar])        
Out[3]: True

注意:正如 DSM 指出的, any(x == y for x in xs)等價於y in xs ,但后者更具可讀性、編寫速度更快且運行速度更快。

一些例子:

In [1]: any(x > 5 for x in range(4))
Out[1]: False

In [2]: all(isinstance(x, int) for x in range(10))
Out[2]: True

In [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])
Out[3]: True

In [4]: all([True, True, True, False, True])
Out[4]: False

另見: http ://docs.python.org/2/library/functions.html#all

暫無
暫無

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

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