pew*_*pew 3 python string list python-idle python-3.x
这是我的代码.我不确定我是否需要一个计数器才能工作.答案应该是'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')
Run Code Online (Sandbox Code Playgroud)
Bha*_*Rao 17
这条线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')
Run Code Online (Sandbox Code Playgroud)
输出将是
iiii
Run Code Online (Sandbox Code Playgroud)
使用in字符串
def eliminate_consonants(x):
for char in x:
if char in 'aeiou':
print(char,end = "")
Run Code Online (Sandbox Code Playgroud)
看起来很简单,语句if char in 'aeiou'检查char字符串中是否存在aeiou.
''.join([c for c in x if c in 'aeiou'])
Run Code Online (Sandbox Code Playgroud)
此列表推导将返回一个列表,该列表仅在角色所在时才包含字符 aeiou
''.join(c for c in x if c in 'aeiou')
Run Code Online (Sandbox Code Playgroud)
这个gen exp将返回一个生成器,而不是仅在角色所在的情况下返回字符 aeiou
您可以使用re.findall仅发现字符串中的元音.代码
re.findall(r'[aeiou]',"mississippi")
Run Code Online (Sandbox Code Playgroud)
将返回在字符串中找到的元音列表,即['i', 'i', 'i', 'i'].所以现在我们可以使用str.join然后再使用了
''.join(re.findall(r'[aeiou]',"mississippi"))
Run Code Online (Sandbox Code Playgroud)对于这种技术,您需要存储一个地图,该地图将每个非元音与一个None类型相匹配.为此您可以使用string.ascii_lowecase.制作地图的代码是
str.maketrans({i:None for i in string.ascii_lowercase if i not in "aeiou"})
Run Code Online (Sandbox Code Playgroud)
这将返回映射.将它存储在变量中(这里m是地图)
"mississippi".translate(m)
Run Code Online (Sandbox Code Playgroud)
这将删除aeiou字符串中的所有非字符.
你可以dict.fromkeys一起使用sys.maxunicode.但请记住import sys!
dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in 'aeiou')
Run Code Online (Sandbox Code Playgroud)
现在用str.translate.
'mississippi'.translate(m)
Run Code Online (Sandbox Code Playgroud)运用 bytearray
正如JFSebastian在下面的评论中所提到的,您可以使用创建小写辅音的bytearray
non_vowels = bytearray(set(range(0x100)) - set(b'aeiou'))
Run Code Online (Sandbox Code Playgroud)
使用这个,我们可以翻译这个词,
'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels)
Run Code Online (Sandbox Code Playgroud)
将返回b'iiii'.这可以str通过使用decodeie 轻松转换b'iiii'.decode("ascii").
运用 bytes
bytes返回一个bytes对象,是不可变的版本bytearray.(具体是Python 3)
non_vowels = bytes(set(range(0x100)) - set(b'aeiou'))
Run Code Online (Sandbox Code Playgroud)
使用这个,我们可以翻译这个词,
'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels)
Run Code Online (Sandbox Code Playgroud)
将返回b'iiii'.这可以str通过使用decodeie 轻松转换b'iiii'.decode("ascii").
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
Run Code Online (Sandbox Code Playgroud)
排序顺序的时间
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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,使用最终方法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
Run Code Online (Sandbox Code Playgroud)
排序顺序的时间
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
Run Code Online (Sandbox Code Playgroud)
你可以尝试这样的pythonic方式,
In [1]: s = 'mississippi'
In [3]: [char for char in s if char in 'aeiou']
Out[3]: ['i', 'i', 'i', 'i']
Run Code Online (Sandbox Code Playgroud)
功能;
In [4]: def eliminate_consonants(x):
...: return ''.join(char for char in x if char in 'aeiou')
...:
In [5]: print(eliminate_consonants('mississippi'))
iiii
Run Code Online (Sandbox Code Playgroud)