use*_*823 2 python python-2.x python-2.7
我试图使用,all()但它不适合我:
>>> names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
>>> all([name for name in names if name[0] == "R"])
True
>>>
Run Code Online (Sandbox Code Playgroud)
我想,以检查是否所有的名字首先"R",即使我添加"Paul"到names,all()仍返回True.我该如何解决这个问题,这样all()的回报False,直到"Paul"被删除?
你误解了它是如何all运作的.来自文档:
all(iterable)返回
True如果的所有元素iterable都为真(或者,如果iterable是空的).
在您的代码中,您首先收集所有R以列表开头的名称,然后将此列表传递给all.执行此操作将始终返回,True因为非空字符串的计算结果为True.
相反,你应该写:
all(name[0] == "R" for name in names)
Run Code Online (Sandbox Code Playgroud)
这将通过一个可迭代的布尔值all.如果全部都是True,则该函数将返回True; 否则,它将返回False.
作为额外的奖励,现在结果将被懒惰地计算,因为我们使用了生成器表达式而不是列表推导.使用列表理解,在确定结果之前测试所有字符串所需的代码.但是,新代码只会根据需要进行检查.