我想了解如何any()与all()Python的内置函数的工作.
我试图比较元组,以便如果任何值不同,那么它将返回True,如果它们都是相同的,它将返回False.他们如何在这种情况下返回[False,False,False]?
d是一个defaultdict(list).
print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该输出
# [False, True, False]
Run Code Online (Sandbox Code Playgroud)
因为(1,1)是相同的,(5,6)是不同的,并且(0,0)是相同的.
为什么所有元组的评估为False?
the*_*eye 334
您可以分别大致考虑any和all作为一系列逻辑or和and运算符.
任何
anyTrue当至少有一个元素是Truthy 时会返回.阅读有关真值测试的信息.
所有
allTrue只有当所有元素都是Truthy 时才会返回.
真相表
+-----------------------------------------+---------+---------+
| | any | all |
+-----------------------------------------+---------+---------+
| All Truthy values | True | True |
+-----------------------------------------+---------+---------+
| All Falsy values | False | False |
+-----------------------------------------+---------+---------+
| One Truthy value (all others are Falsy) | True | False |
+-----------------------------------------+---------+---------+
| One Falsy value (all others are Truthy) | True | False |
+-----------------------------------------+---------+---------+
| Empty Iterable | False | True |
+-----------------------------------------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
注1:官方文档中解释了空的可迭代案例,如下所示
True如果iterable的任何元素为true,则返回.如果iterable为空,则返回False
由于没有任何元素为真,因此False在这种情况下返回.
返回
True如果迭代的所有元素都是真(或者,如果可迭代为空).
由于没有元素是假的,因此True在这种情况下返回.
笔记2:
另一个重要的事情了解any和all,它会短路的执行,他们知道结果的那一刻.优点是,不需要消耗整个可迭代.例如,
>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))
>>> any(multiples_of_6)
True
>>> list(multiples_of_6)
[False, False, False]
Run Code Online (Sandbox Code Playgroud)
这里(not (i % 6) for i in range(1, 10))是一个生成器表达式,True如果1和9中的当前数字是6的倍数则返回.any迭代它multiples_of_6,当它遇到时6,它会找到Truthy值,因此它会立即返回True,而其余部分multiples_of_6不会被迭代.这就是我们在打印时看到list(multiples_of_6)的结果7,8和9.
在这个答案中非常巧妙地使用了这个优秀的东西.
有了这个基本的理解,如果我们看一下你的代码,你就可以了
any(x) and not all(x)
Run Code Online (Sandbox Code Playgroud)
这确保了至少其中一个值是Truthy但不是全部.这就是它回归的原因[False, False, False].如果你真的想检查这两个数字是否相同,
print [x[0] != x[1] for x in zip(*d['Drd2'])]
Run Code Online (Sandbox Code Playgroud)
Aar*_*all 40
Python
any和all函数如何工作?
any并且如果任何和所有(分别)元素都是,则all采用iterables并返回.TrueTrue
>>> any([0, 0.0, False, (), '0']), all([1, 0.0001, True, (False,)])
(True, True) # ^^^-- truthy non-empty string
>>> any([0, 0.0, False, (), '']), all([1, 0.0001, True, (False,), {}])
(False, False) # ^^-- falsey
Run Code Online (Sandbox Code Playgroud)
如果iterables为空,则any返回False并all返回True.
>>> any([]), all([])
(False, True)
Run Code Online (Sandbox Code Playgroud)
我演示all并any为今天学生上课.他们大多对空迭代的返回值感到困惑.以这种方式解释会导致很多灯泡打开.
他们,any并且all都在寻找允许他们停止评估的条件.我给出的第一个例子要求他们评估整个列表中每个元素的布尔值.
(请注意,列表文字本身不会被懒惰地评估 - 你可以通过迭代器得到它- 但这只是为了说明目的.)
这是任何和所有的Python实现:
def any(iterable):
for i in iterable:
if i:
return True
return False # for an empty iterable, any returns False!
def all(iterable):
for i in iterable:
if not i:
return False
return True # for an empty iterable, all returns True!
Run Code Online (Sandbox Code Playgroud)
当然,真正的实现是用C语言编写的,并且性能更高,但是您可以替换上面的内容并在此(或任何其他)答案中获得相同的代码结果.
allall检查要生成的元素False(因此可以返回False),然后True如果没有,则返回False.
>>> all([1, 2, 3, 4]) # has to test to the end!
True
>>> all([0, 1, 2, 3, 4]) # 0 is False in a boolean context!
False # ^--stops here!
>>> all([])
True # gets to end, so True!
Run Code Online (Sandbox Code Playgroud)
any方法any是检查要素True(因此它可以返回True), then it returnsFalse if none of them wereTrue`.
>>> any([0, 0.0, '', (), [], {}]) # has to test to the end!
False
>>> any([1, 0, 0.0, '', (), [], {}]) # 1 is True in a boolean context!
True # ^--stops here!
>>> any([])
False # gets to end, so False!
Run Code Online (Sandbox Code Playgroud)
我想如果你记住短切行为,你将直观地理解它们如何工作而不必参考真值表.
all和any捷径:首先,创建一个noisy_iterator:
def noisy_iterator(iterable):
for i in iterable:
print('yielding ' + repr(i))
yield i
Run Code Online (Sandbox Code Playgroud)
现在让我们使用我们的示例来大声迭代列表:
>>> all(noisy_iterator([1, 2, 3, 4]))
yielding 1
yielding 2
yielding 3
yielding 4
True
>>> all(noisy_iterator([0, 1, 2, 3, 4]))
yielding 0
False
Run Code Online (Sandbox Code Playgroud)
我们可以all在第一个False布尔检查上看到停止.
并any在第一个True布尔检查停止:
>>> any(noisy_iterator([0, 0.0, '', (), [], {}]))
yielding 0
yielding 0.0
yielding ''
yielding ()
yielding []
yielding {}
False
>>> any(noisy_iterator([1, 0, 0.0, '', (), [], {}]))
yielding 1
True
Run Code Online (Sandbox Code Playgroud)
Art*_*cca 13
我知道这是旧的,但我认为在代码中显示这些函数的外观可能会有所帮助.这真的说明了逻辑,比文本或表IMO更好.实际上它们是用C而不是纯Python实现的,但这些都是等价的.
def any(iterable):
for item in iterable:
if item:
return True
return False
def all(iterable):
for item in iterable:
if not item:
return False
return True
Run Code Online (Sandbox Code Playgroud)
特别是,您可以看到空迭代的结果只是自然结果,而不是特殊情况.您还可以看到短路行为; 实际上,没有短路的工作会更多.
当吉多·范罗苏姆(Python的创造者)首次提出将any()和all()他的只是发表恰好上面的代码片段解释它们.
你问的问题代码来自我在这里给出的答案.它旨在解决比较多个位阵列的问题 - 即1和的集合0.
anyall当你可以依赖于值的"真实性" - 即它们在布尔上下文中的值时,它们很有用.1是True0 False,是答案所利用的便利.5恰好也是True,所以当你把它混合到你可能的输入中......好吧.不行.
你可以做这样的事情:
[len(set(x)) == 1 for x in zip(*d['Drd2'])]
Run Code Online (Sandbox Code Playgroud)
它缺乏前一个答案的美学(我真的很喜欢它的外观any(x) and not all(x)),但它完成了工作.
>>> any([False, False, False])
False
>>> any([False, True, False])
True
>>> all([False, True, True])
False
>>> all([True, True, True])
True
Run Code Online (Sandbox Code Playgroud)
s = "eFdss"
s = list(s)
all(i.islower() for i in s ) # FALSE
any(i.islower() for i in s ) # TRUE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
260463 次 |
| 最近记录: |