python - 从 Python 中的字符串中删除辅音

标签 python string list python-3.x python-idle

这是我的代码。我不确定我是否需要一个计数器才能工作。答案应该是'iiii'

def eliminate_consonants(x):
        vowels= ['a','e','i','o','u']
        vowels_found = 0
        for char in x:
            if char == vowels:
                print(char)

eliminate_consonants('mississippi')

最佳答案

更正您的代码

if char == vowels: 是错误的。它必须是 if char in vowels:。这是因为您需要检查元音列表中是否存在该特定字符。除此之外,您需要 print(char,end = '')(在 python3 中)将输出打印为 iiii 全部在一行中。

最终的程序会是这样的

def eliminate_consonants(x):
        vowels= ['a','e','i','o','u']
        for char in x:
            if char in vowels:
                print(char,end = "")

eliminate_consonants('mississippi')

输出将是

iiii

其他方式包括

  • 字符串中使用

    def eliminate_consonants(x):
        for char in x:
            if char in 'aeiou':
                print(char,end = "")
    

    语句 if char in 'aeiou' 看起来很简单,它检查 char 是否出现在字符串 aeiou 中。

  • A list comprehension

     ''.join([c for c in x if c in 'aeiou'])
    

    此列表理解将返回一个列表,该列表仅当字符位于 aeiou

  • 中时才包含该字符
  • A generator expression

    ''.join(c for c in x if c in 'aeiou')
    

    这个 gen exp 将返回一个生成器,而不是仅当字符在 aeiou

  • 中时才返回字符
  • Regular Expressions

    您可以使用 re.findall只发现字符串中的元音。代码

    re.findall(r'[aeiou]',"mississippi")
    

    将返回在字符串中找到的元音列表,即 ['i', 'i', 'i', 'i']。所以现在我们可以使用 str.join 然后使用

    ''.join(re.findall(r'[aeiou]',"mississippi"))
    
  • str.translatemaketrans

    对于此技术,您将需要存储一个映射,该映射将每个非元音字母匹配到 None 类型。为此,您可以使用 string.ascii_lowecase .制作 map 的代码是

    str.maketrans({i:None for i in string.ascii_lowercase if i not in "aeiou"})
    

    这将返回映射。请将其存储在一个变量中(此处为 map 的 m)

    "mississippi".translate(m)
    

    这将从字符串中删除所有非 aeiou 字符。

  • 使用 dict.fromkeys

    您可以将 dict.fromkeyssys.maxunicode 一起使用.但是记得先 import sys !

    dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in 'aeiou')
    

    现在使用 str.translate

    'mississippi'.translate(m)
    
  • 使用 bytearray

    J.F.Sebastian 所述在comments below ,您可以使用

    创建小写辅音的字节数组
    non_vowels = bytearray(set(range(0x100)) - set(b'aeiou'))
    

    使用这个我们可以翻译这个词,

    'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels)
    

    这将返回 b'iiii'。这可以通过使用 decode 轻松转换为 str,即 b'iiii'.decode("ascii")

  • 使用 bytes

    bytes 返回一个字节对象,是 bytearray 的不可变版本。 (它是特定于 Python 3 的)

    non_vowels = bytes(set(range(0x100)) - set(b'aeiou'))
    

    使用这个我们可以翻译这个词,

    'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels)
    

    这将返回 b'iiii'。这可以通过使用 decode 轻松转换为 str,即 b'iiii'.decode("ascii")


时序比较

python 3

python3 -m timeit -s "text = 'mississippi'*100; non_vowels = bytes(set(range(0x100)) - set(b'aeiou'))" "text.encode('ascii', 'ignore').translate(None, non_vowels).decode('ascii')"
100000 loops, best of 3: 2.88 usec per loop
python3 -m timeit -s "text = 'mississippi'*100; non_vowels = bytearray(set(range(0x100)) - set(b'aeiou'))" "text.encode('ascii', 'ignore').translate(None, non_vowels).decode('ascii')"
100000 loops, best of 3: 3.06 usec per loop
python3 -m timeit -s "text = 'mississippi'*100;d=dict.fromkeys(i for i in range(127) if chr(i) not in 'aeiou')" "text.translate(d)"
10000 loops, best of 3: 71.3 usec per loop
python3 -m timeit -s "import string; import sys; text='mississippi'*100; m = dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in 'aeiou')" "text.translate(m)"
10000 loops, best of 3: 71.6 usec per loop
python3 -m timeit -s "text = 'mississippi'*100" "''.join(c for c in text if c in 'aeiou')"
10000 loops, best of 3: 60.1 usec per loop
python3 -m timeit -s "text = 'mississippi'*100" "''.join([c for c in text if c in 'aeiou'])"
10000 loops, best of 3: 53.2 usec per loop
python3 -m timeit -s "import re;text = 'mississippi'*100; p=re.compile(r'[aeiou]')" "''.join(p.findall(text))"
10000 loops, best of 3: 57 usec per loop

时间排序

translate (bytes)    |  2.88
translate (bytearray)|  3.06
List Comprehension   | 53.2
Regular expressions  | 57.0
Generator exp        | 60.1
dict.fromkeys        | 71.3
translate (unicode)  | 71.6

如您所见,使用 bytes 的 final方法是最快的。


python 3.5

python3.5 -m timeit -s "text = 'mississippi'*100; non_vowels = bytes(set(range(0x100)) - set(b'aeiou'))" "text.encode('ascii', 'ignore').translate(None, non_vowels).decode('ascii')"
100000 loops, best of 3: 4.17 usec per loop
python3.5 -m timeit -s "text = 'mississippi'*100; non_vowels = bytearray(set(range(0x100)) - set(b'aeiou'))" "text.encode('ascii', 'ignore').translate(None, non_vowels).decode('ascii')"
100000 loops, best of 3: 4.21 usec per loop
python3.5 -m timeit -s "text = 'mississippi'*100;d=dict.fromkeys(i for i in range(127) if chr(i) not in 'aeiou')" "text.translate(d)"
100000 loops, best of 3: 2.39 usec per loop
python3.5 -m timeit -s "import string; import sys; text='mississippi'*100; m = dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in 'aeiou')" "text.translate(m)"
100000 loops, best of 3: 2.33 usec per loop
python3.5 -m timeit -s "text = 'mississippi'*100" "''.join(c for c in text if c in 'aeiou')"
10000 loops, best of 3: 97.1 usec per loop
python3.5 -m timeit -s "text = 'mississippi'*100" "''.join([c for c in text if c in 'aeiou'])"
10000 loops, best of 3: 86.6 usec per loop
python3.5 -m timeit -s "import re;text = 'mississippi'*100; p=re.compile(r'[aeiou]')" "''.join(p.findall(text))"
10000 loops, best of 3: 74.3 usec per loop

时间排序

translate (unicode)  |  2.33
dict.fromkeys        |  2.39
translate (bytes)    |  4.17
translate (bytearray)|  4.21
List Comprehension   | 86.6
Regular expressions  | 74.3
Generator exp        | 97.1

关于python - 从 Python 中的字符串中删除辅音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29998052/

相关文章:

python - python 中的递归函数,返回作为参数给出的列表的副本,其中 a 被 b 替换,并且不会更改作为参数给出的列表

python - 在列表的同一子列表中搜索多个元素

javascript - 我的子列表的 .onclick 函数仅显示一瞬间 - Jquery

python - REGEX 删除注释和前导/尾随空格

python - 如何避免 'IndexError: list index out of range' 错误?

c - 程序查找文本中有多少个单词不包含特定字符

string - 在 HTTP 请求的上下文中,一个 255 字节的字符串有多长?

python - 对于一般用途,哪个是最容易上手的 Python Web 应用程序框架?

python - Pandas:删除包含整数和字符串的混合类型系列中的所有字符串组件

php - 数据库中的空文本框为 NULL