【问题标题】:Check presence of vowels in a string检查字符串中元音的存在
【发布时间】:2014-03-16 08:12:21
【问题描述】:

我需要检查单词中是否存在元音。如果是,则应对单词sayop(word)进行操作。我想避免 for 循环,因为我想到了这一点:

for char in word:
    if char in 'aeiou':
#confused here... 

请推荐一种在执行时间方面成本低的方法。另外,请帮我纠正上述方法。

【问题讨论】:

标签: python string for-loop


【解决方案1】:
vowels = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
if any(char in vowels for char in word):
   ...

注意:这更好,因为它会在找到单词中的元音后立即短路。因此,除非字符串中没有元音,否则不必检查所有字符。

编辑:运行timeit test 并发现@falsetru's answer 非常快,但几乎没有优化,re 版本优于其他所有版本。

import re

vowels = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
pattern = re.compile("[AEIOUaeiou]")

def intersection():
    return bool(vowels.intersection("TWYNDYLLYNGS"))

def any_version():
    return any(char in vowels for char in "TWYNDYLLYNGS")

def re_version():
    return bool(pattern.search("TWYNDYLLYNGS"))

def disjoint():
    return vowels.isdisjoint("TWYNDYLLYNGS")

from timeit import timeit

print timeit("intersection()", "from __main__ import intersection, vowels")
print timeit("any_version()", "from __main__ import any_version, vowels")
print timeit("re_version()", "from __main__ import re_version, vowels")
print timeit("disjoint()", "from __main__ import disjoint, vowels")

【讨论】:

  • 对我来说,2013 年末的 macbookpro 与 python 3.7 不相交使用你的 timeit 脚本会稍微快一些
【解决方案2】:

您可以使用set intersection 避免for 循环

if set('aeiou').intersection(word.lower()):

【讨论】:

    【解决方案3】:

    使用set.isdisjoint(该方法一找到匹配就返回):

    >>> vowels = set('aeiou') # set('aeiouAEIOU') if you want case-insensitivty
    >>> not vowels.isdisjoint('bcd')
    False
    >>> not vowels.isdisjoint('hello')
    True
    

    【讨论】:

    • not vowels.isdisjoint('WORD')
    • @BurhanKhalid,也许你看到了旧版本的答案。请参阅答案中的评论。
    • 或者你可以做not vowels.isdisjoint(word.lower())
    • @falsetru +1。伙计,这速度非常快
    • @Sword,没错。或者你唯一要做的就是增加counts: counts += not vowels.disjoint(word)
    【解决方案4】:

    你可以使用正则表达式。

    import re
    
    if re.search('[AEIOU]', word, flags=re.I):
        # contains vowels
    else:
        # does not
    

    【讨论】:

    • re.search('[aeiou]', word, flags=re.I)
    【解决方案5】:
    def vowelz(a):
            vowels = ["a", "e", "i", "o", "u"]
            vowel = False
            for vowell in vowels:
                    if vowell in a:
                            vowel = True
            print vowel
    vowelz(raw_input("Enter a word:"))
    

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。不鼓励仅使用代码回答。
    【解决方案6】:

    或者你可以这样做。很简单。

    line = input('Enter text: ')
    frequency = {'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0}
    for i in line:
        if i in 'aeiou':
            frequency[character] = frequency[character] + 1
    for vowel in 'aeiou':
        print(vowel + ': ' + str(frequency[vowel]))
    

    【讨论】:

      猜你喜欢
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2021-11-02
      • 2016-06-11
      • 1970-01-01
      • 2019-08-06
      相关资源
      最近更新 更多