4

我想知道以下结果如何产生 True.None 条件是 True?

有什么输入吗?

>>> listitem=['a','h','o','t']
>>> valid_compare_diff
['0', '1', '2', '3', '4']
>>> all(x for x in listitem if x in valid_compare_diff)
True

新变化:-

>>> listitem=['0']
>>> valid_compare_diff
['0', '1', '2', '3', '4']
>>> all(x for x in listitem if x in valid_compare_diff)
True

当列表理解产生结果时,结果为什么仍然是真实的......??

4

3 回答 3

8

理解将是空的,因为没有值x满足条件:

if x in valid_compare_diff

因此:

>>> [x for x in listitem if x in valid_compare_diff]
[]

结果[],当传递给all返回时True

>>> all([])
True

之所以如此,是因为all声明的定义是,如果传递给它的可迭代对象为空,则它返回True

all(...)
    all(iterable) -> bool

    Return True if bool(x) is True for all values x in the iterable.
    If the iterable is empty, return True.
于 2013-05-20T14:06:38.627 回答
5

正如 Henny 所说,您的收藏是空的,因为您只查看那些已经满足您的条件的值。

如果检查通过,您希望返回检查结果,而不是元素:

all(x in valid_compare_diff for x in listitem)

使用(x for x in listitem if x in valid_compare_diff),您将获得listitem属于的所有这些值valid_compare_diff(在您的情况下,没有)。

(x in valid_compare_diff for x in listitem), for each x,你取表达式的值(x in valid_compare_diff),给你一个boolfor each x

于 2013-05-20T14:09:25.493 回答
0
(x for x in listitem if x in valid_compare_diff)

说“收集所有的xslistitem也都在valid_compare_diff. 传递all()它只关心x你确实拾取的那些 s,因此True除非你至少拾取一个错误x,否则它不会关心(甚至不知道)你是如何选择那些xs 摆在首位的。

于 2013-05-20T14:11:20.327 回答