如果我有一个给定字符串列表'hello':
,我该如何找到x = ['hello', 'hello', 'hello']
# evaluates to True
x = ['hello', '1']
# evaluates to False
答案 0 :(得分:14)
使用all()
function测试所有元素的条件是否为True
:
all(el == 'hello' for el in x)
all()
函数采用可迭代(逐个产生结果的东西),并且如果所有这些元素都为真,则只返回True
。
这里的iterable是一个生成器表达式,它对输入序列中的每个元素执行相等性测试。 all()
如果遇到错误值则停止提前迭代的事实使得此测试非常有效,如果包含的生成器表达式中的测试在早期对任何元素都为False。
请注意,如果x
为空,则all()
会返回True
以及,因为它找不到任何元素在空序列中是假的。您可以测试序列是非空的 first :
if x and all(el == 'hello' for el in x):
解决这个问题。
答案 1 :(得分:5)
这应该有效:
# First check to make sure 'x' isn't empty, then use the 'all' built-in
if x and all(y=='hello' for y in x):
关于all
内置的好处是它在找到的第一个不符合条件的项目上停止。这意味着使用大型列表非常有效。
此外,如果列表中的所有项都是字符串,那么您可以使用字符串的lower
方法来匹配“HellO”,“hELLO”等内容。
if x and all(y.lower()=='hello' for y in x):
答案 2 :(得分:2)
另一种做你想做的事情的方法(all
是最惯用的方式,正如所有其他答案所指出的那样),如果您需要多次检查,则非常有用:
s = set(l)
cond = (len(s) == 1) and (item in s)
每次要检查条件时,有助于避免O(n)
遍历。
答案 3 :(得分:1)
使用filter和len很容易。
x = ['hello', 'hello', 'hello']
s = 'hello'
print len(filter(lambda i:i==s, x))==len(x)
答案 4 :(得分:1)
你可以使用set
:
set(x) == {'hello'}