4

如果我有给定字符串“hello”的列表,我将如何找到:

x = ['hello', 'hello', 'hello']
# evaluates to True

x = ['hello', '1']
# evaluates to False
4

5 回答 5

14

使用该all()函数测试条件是否适用True于所有元素:

all(el == 'hello' for el in x)

该函数接受一个可迭代的(一个一个产生结果的东西),并且只有在所有这些元素都为真all()时才会返回自己。True当它发现任何错误的东西时,它就会返回False并且不再查看。

这里的 iterable 是一个生成器表达式,它对输入序列中的每个元素执行相等测试。all()如果在包含的生成器表达式中的测试早期对于任何元素都是 False,那么如果遇到错误值就会提前停止迭代这一事实使得该测试非常有效。

请注意,如果x,则all()返回True 并且它不会在空序列中找到任何为假的元素。您可以先测试序列是否为非空:

if x and all(el == 'hello' for el in x):

解决这个问题。

于 2013-08-25T23:06:58.980 回答
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):
于 2013-08-25T23:06:40.610 回答
2

另一种做你想做的事情的方法(all是最惯用的方法,正如所有其他答案所指出的那样),如果你需要检查多次:

s = set(l)
cond = (len(s) == 1) and (item in s)

O(n)每次要检查条件时,它都有助于避免遍历。

于 2013-08-25T23:21:57.867 回答
1

使用 filter 和 len 很容易。

x = ['hello', 'hello', 'hello']
s = 'hello'
print len(filter(lambda i:i==s, x))==len(x)
于 2013-08-25T23:32:12.020 回答
1

Youn 可以使用set

set(x) == {'hello'}
于 2016-10-17T14:16:16.183 回答