多条件python

多条件python,python,if-statement,Python,If Statement,我想做一个计算字符串中辅音的函数,所以我尝试这样做: def vowel_count(foo): count = 0 for i in foo: if not i == 'a' and i == 'e' and i ... and i == 'O' and i == 'U': count += 1 return count 但这是相当丑陋和乏味的事情,更多的情况下更是如此。有没有办法把它们放在一起?您正在寻找not in操作符 def vowel_count(foo

我想做一个计算字符串中辅音的函数,所以我尝试这样做:

def vowel_count(foo):
  count = 0
  for i in foo:
    if not i == 'a' and i == 'e' and i ... and i == 'O' and i == 'U':
      count += 1
return count

但这是相当丑陋和乏味的事情,更多的情况下更是如此。有没有办法把它们放在一起?

您正在寻找
not in
操作符

def vowel_count(foo):
    count = 0
    for i in foo.lower():
        if i not in 'aeiou':
            count += 1
    return count
或者更简单地说:

def vowel_count(foo):
    return sum(i not in 'aeiou' for i in foo.lower())  # True == 1, False == 0

使用容器以较低的形式存储元音:

def vowel_count(foo):
    vowel = ["a", "e", "i", "o", "u", "y"]
    count = 0
    for i in foo:
        if i.lower() not in vowel:
            count += 1
然后你也可以用一个过滤器来做一些不同的事情

def condition(letter):
    vowel = ["a", "e", "i", "o", "u", "y"]
    if letter.lower() not in vowel and letter != " ":
        return True
    else:
        return False

foo = 'bnojouearoui okeorjaji '
count = len(list(filter(condition, foo)))

“aeiou”中的
i.lower()
?还要注意,您的原始代码并不是您想要的<代码>非a和b以及c被理解为
(非a)以及b和c
,这与
非(a和b以及c)
有很大不同。一个字符很难同时成为“e”和“O”以及“U”,即使它不是“a”。
sum(c代表k,c在collections.Counter(i.lower())如果k在'aeiou')
是否最好先构建一次集合?我还认为使用
。。。如果我不在
中,通常比协调
我不在…
从bool到int的速度要快?无需执行
设置(…)
——速度要慢得多。它在每次迭代中从字符串创建一个集合。您可以使用
set
操作来代替。@warvariuc我在错误的假设下工作,即优化器将在编译时创建集合。另外,尽管从技术上讲,中的
是对字符串的O(n)操作,但它是如此短的字符串,以至于字符串仍然比集合稍快。或者,简言之,注意过早优化;)@warvariuc:您可以在循环之前甚至在函数外部创建一组计数(或折扣)字符。我不明白为什么每次迭代都需要构造它。。。问题在于
中的
是否对
set
str
更有效(我怀疑
set
,但在不进行分析的情况下不会明确说明),但您肯定可以在不影响性能的情况下构建一个集合。