这是我的代码。我不确定是否需要计数器才能正常工作。答案应该是'iiii'。
'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全部打印在一行中。
if char == vowels:
if char in vowels:
print(char,end = '')
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')
输出将是
in
def eliminate_consonants(x): for char in x: if char in 'aeiou': print(char,end = "")
看起来很简单,该语句if char in 'aeiou'检查charstring中是否存在aeiou。
if char in 'aeiou'
char
aeiou
''.join([c for c in x if c in 'aeiou'])
此列表推导将返回仅包含字符的列表,该列表将包含字符 aeiou
''.join(c for c in x if c in 'aeiou')
此gen exp将返回一个生成器,而仅当字符位于 aeiou
您可以re.findall用来仅发现字符串中的元音。编码
re.findall
re.findall(r'[aeiou]',"mississippi")
将返回在字符串ie中找到的元音列表['i', 'i', 'i', 'i']。所以现在我们可以使用str.join然后使用
['i', 'i', 'i', 'i']
str.join
''.join(re.findall(r'[aeiou]',"mississippi"))
str.translate
maketrans
对于此技术,您将需要存储一个将每个非元音与None类型匹配的映射。为此,您可以使用string.ascii_lowecase。制作地图的代码是
None
string.ascii_lowecase
str.maketrans({i:None for i in string.ascii_lowercase if i not in "aeiou"})
这将返回映射。请将其存储在变量中(此处m用于地图)
m
"mississippi".translate(m)
这将从aeiou字符串中删除所有非字符。
dict.fromkeys
您可以dict.fromkeys与一起使用sys.maxunicode。但是请记住import sys要先!
sys.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
正如JFSebastian在下面的注释中提到的那样,您可以使用以下命令创建小写辅音的字节数组
non_vowels = bytearray(set(range(0x100)) - set(b'aeiou'))
使用这个我们可以翻译单词,
'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels)
这将返回b'iiii'。str通过使用decodeie可以很容易地将其转换为b'iiii'.decode("ascii")。
b'iiii'
str
decode
b'iiii'.decode("ascii")
bytes
bytes返回一个字节对象,它是的不可变版本bytearray。( 特定于Python 3 )
non_vowels = bytes(set(range(0x100)) - set(b'aeiou'))
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是最快的。
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