在这段代码中,我试图创建一个函数anti_vowel,它将从字符串中删除所有元音(aeiouAEIOU).我认为它应该可以正常工作,但是当我运行它时,示例文本"嘿看单词!" 以"Hy lk Words!"返回.它"忘记"删除最后一个'o'.怎么会这样?
text = "Hey look Words!"
def anti_vowel(text):
textlist = list(text)
for char in textlist:
if char.lower() in 'aeiou':
textlist.remove(char)
return "".join(textlist)
print anti_vowel(text)
Run Code Online (Sandbox Code Playgroud) for item in somelist:
if determine(item):
code_to_remove_item
Run Code Online (Sandbox Code Playgroud)
似乎共识就是这样的
somelist[:] = [x for x in somelist if not determine(x)]
Run Code Online (Sandbox Code Playgroud)
但是,我认为如果你只删除一些项目,大多数项目都被复制到同一个对象中,也许这很慢.在回答另一个相关问题时,有人建议:
for item in reversed(somelist):
if determine(item):
somelist.remove(item)
Run Code Online (Sandbox Code Playgroud)
但是,这里list.remove将搜索项目,即列表长度为O(N).可能我们受到限制,因为列表表示为数组而不是链表,因此删除项目后需要移动所有内容.但是,这里建议collections.dequeue表示为双向链表.然后可以在迭代时在O(1)中移除.我们如何实现这一目标?
更新:我也做了一些时间测试,使用以下代码:
import timeit
setup = """
import random
random.seed(1)
b = [(random.random(),random.random()) for i in xrange(1000)]
c = []
def tokeep(x):
return (x[1]>.45) and (x[1]<.5)
"""
listcomp = """
c[:] = [x for x in b if tokeep(x)]
""" …Run Code Online (Sandbox Code Playgroud) 这是python中输入的"脏"列表
input_list = [' \n ',' data1\n ',' data2\n',' \n','data3\n'.....]
Run Code Online (Sandbox Code Playgroud)
每个列表元素包含带有新行字符的空格或带有换行字符的数据
使用以下代码清理它..
cleaned_up_list = [data.strip() for data in input_list if data.strip()]
Run Code Online (Sandbox Code Playgroud)
给
cleaned_up_list = ['data1','data2','data3','data4'..]
Run Code Online (Sandbox Code Playgroud)
strip()在上面的列表理解期间,python是否内部调用了两次?或者我是否必须使用for循环迭代,strip()如果我关心效率,我只需要一次?
for data in input_list
clean_data = data.strip()
if(clean_data):
cleaned_up_list.append(clean_data)
Run Code Online (Sandbox Code Playgroud)