我希望按照长度清除列表,删除小字。
def is_word_min_than(number, word):
if len(word) > number:
return False
else:
return True
def filtrate_valid_words(query):
min_len_number = 3
for word in query:
if is_word_min_than(min_len_number, word):
query.remove(word)
return query
filtrate_valid_words(['tacos',',','kkk'])
我的最后一个值是在返回的查询中,它没有在那里。我想出了这种情况,因为我正在修改我正在迭代的对象。
所以我克隆了我的第一份清单。
def is_word_min_than(number, word):
if len(word) > number:
return False
else:
return True
def filtrate_valid_words(query):
min_len_number = 3
original_query = query
for word in original_query:
if is_word_min_than(min_len_number, word):
query.remove(word)
return query
filtrate_valid_words(['tacos',',','kkk'])
同样的事情正在发生,我不知道为什么。 无论如何,我使用了我想到的第一个解决方案。
def is_word_min_than(number, word):
if len(word) > number:
return False
else:
return True
def filtrate_valid_words(query):
min_len_number = 3
words_to_delete = []
for word in query:
if is_word_min_than(min_len_number, word):
words_to_delete.append(word)
for word in words_to_delete:
query.remove(word)
return query
现在正在努力,但我只是好奇为什么会发生这种情况。 谢谢,我希望不是真的很蠢。如果我不会感到惊讶,我必须去睡觉。
答案 0 :(得分:3)
Python不支持从正在迭代的列表中删除元素。这正是您的第一个解决方案中发生的事情。
您可能会说您在list
中复制了original_query = query
,但事实并非如此。此行仅复制不产生和不同的参考。
如果您真的要复制输入
,那么您的第一个解决方案将有效original_query = list(query)
或者只使用更有效和可读的单行
filtered = [word for word in query if len(word) > 3]