Removing vowels from the string python
我期望下面代码中没有元音的字符串,但它没有给出我所期望的。请帮忙。
1 2 3 4 5 6 7 8 9 10
| def disemvowel(word):
words = list(word)
for i in words:
if i.upper() =="A" or i.upper() =="E" or i.upper() =="I" or i.upper() =="O" or i.upper() =="U":
words.remove(i)
return print(''.join(words))
disemvowel("uURII") |
我本来以为输出是"r",但我得到的是"uri"。
- 我不认为这是个骗局。在那个问题上,他犯了一个与手术完全不同的错误。而且,假设他想知道自己在做什么,而不仅仅是扔掉自己的代码和其他人的货物崇拜,那么这个问题及其答案不会对他有所帮助。
- @阿巴纳公平点。
- @我同意复制品并不像你那样解释它,但还有其他复制品可以解释这种众所周知的行为。让我找一个。
- @Jean Fran&231;Oisfabre第二个dup(关于如何从列表中删除项目)对OP和其他任何有问题的人都非常有用;如果它还没有自动关闭,我会投票关闭它。
- 这是最近的一次,我当时就跟踪了那个问题。你没有。人们可以错过一些骗局。只是不是所有人都像某些人那样,就是这样:)
- @Jean-Fran&Oisfabre顺便说一句,以前有一个(非现场)收藏,有人在某个经常有用的dup中设置了一个比搜索 hopefully appropriate keywords更容易的地方;你知道它是否还在任何地方维护吗?
- 那个?sopython.com/canon/?page=1不错(但不如我的个人收藏好:)
- @Jean Fran&231;Oisfabre谢谢!这甚至比几年前的情况要好(可能是它的新发展?);书签。
不要在我的remove在线呼叫列表迭代过它。P></
当你认为它能做什么。P></
- 第一,words = 'uURII'iis at its指指点点,和第一个字。
- 你words.remove(i)呼叫。现在words = 'URII'iis at its指指点点,和第一个字。
- the next time一环,words = 'URII'is to its指指点点,和i二字。哎呀,你错过U茶!
there are to fix一些方式-你可以在这个迭代过copy of the list,你可以索引或EN instead of the start from the端,你可以在使用前和使while指数在环增量(not to found something直到你删除你不想要的,等等。P></
but is to just the扩路集结在列表:P></
1 2 3 4 5 6 7 8 9
| def disemvowel(word):
words = list(word)
new_letters = []
for i in words:
if i.upper() =="A" or i.upper() =="E" or i.upper() =="I" or i.upper() =="O" or i.upper() =="U":
pass
else:
new_letters.append(i)
print(''.join(new_letters)) |
这周你需要list(word)均值不在第一的地方;你可以只是迭代过原始的字符串。P></
你在这可以简化一些其他方式使用instead of a集会员检查检查==五分开,把茶叶在茶比较,跟踪和辊环进入列表理解(或发电机expression):P></
1 2 3 4
| def disemvowel(word):
vowels = set('AEIOU')
new_letters = [letter for letter in word if letter.upper() not in vowels]
print(''.join(new_letters)) |
…but is the same the Basic的想法。P></
- if letter.upper() not in set('AEIOU'):让我告诉你,它不是很有效,因为set('AEIOU')是在每次迭代中构建的。为了提高速度。要么预先构建集合,要么使用{'A','E','I','O','U'},所以它是字面的。此外,当有5个字母时,使用set没有多大帮助。
- @Jean-Fran&231;Oisfabre很好。不管怎么说,对OP来说命名这个集合可能更清楚。(我更多地使用了一个集合,因为从概念上讲,我们正在检查它是否在一组字母中,这并不是为了提高效率,而是因为您的更改同时带来了两个好处。)
- 已经好多了。在一个真正的程序中,我会使它全局化,所以它只构建一次(或者使用文本形式)。但那只是吹毛求疵。
- @Jean-Fran&231;Oisfabre当然,如果您真的很担心性能,那么每次通过循环的LOAD_GLOBAL都会产生影响;您可能希望将其分配给本地(显式地在函数顶部,或者通过默认参数值)。但这几乎不重要。
- 您可能已经注意到我是一个性能狂热者:)问题是,有些人在这里以身作则,并使代码适应他们非常大的数据集。然后他们抱怨:你的回答不起作用:)
- @Jean-Fran&Oisfabre我更关心的是人们在学习,而不是人们在没有思考的情况下获得他们可以使用的代码,我也不在乎他们以后是否抱怨他们没有思考就不能使用它。此外,我从来没有看到有人抱怨代码太慢了5%。通常,当他们说"最有效的方法是什么"时,不是因为他们需要进行微观优化,而是因为他们没有好的理由使用指数时间递归算法。
- @谢谢你。我看到人们只是在寻找另一种解决方案,而不是澄清问题。像你这样的人使这个社区成为一个很棒的地方。很好的一天!
this should help。P></
1 2 3 4 5
| def disemvowel(word):
words = list(word)
v = ["a","e","i","o","u"] #list of vowel
return"".join([i for i in words if i.lower() not in v]) #check if alphabet not in vowel list
print disemvowel("uURII") |
输出:P></
- 如果你只是给他一个新的代码而不解释它的作用,或者他现有的代码有什么问题,那么至少要使它简单和惯用。你为什么在这里做words = list(word)?为什么v是一个列表而不是一个集合(或者一个字符串)?同时,在这里使用lower并不是错误的,但这会使操作人员认为他在尝试使用upper的方式有问题,而在没有错误的情况下。