Python列表的行为很奇怪
我想根据列表的长度来清理列表,删除一些小词Python列表的行为很奇怪,python,python-2.7,Python,Python 2.7,我想根据列表的长度来清理列表,删除一些小词 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_tha
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
现在正在工作,但我只是好奇为什么会这样。
谢谢你,我希望这不是真的愚蠢。如果是这样,我就不会感到惊讶了,我必须去睡觉 Python不支持从正在迭代的列表中删除元素。这正是第一个解决方案中发生的情况 您可能会说您在
original\u query=query
中复制了列表
,但事实并非如此。这一行只复制了没有意义和区别的引用
如果您真的要复制您的输入,那么您的第一个解决方案将起作用
original_query = list(query)
或者只使用一个更有效、更可读的行程序
filtered = [word for word in query if len(word) > 3]
我必须去睡觉了???@Lara:说“请解决我的问题,我现在就睡觉”的风格不好。是的,也许我看不到明显的原因,因为我累了。Y说我已经解决了,我只是好奇。正如Yossi在他的回答中提到的,你没有真正克隆
查询
,你只是将同一个列表对象绑定到一个新名称,因此,您现在可以使用query
或original\u query
引用该对象。请看Ned Batcheld的优秀文章