Python列表表现得很奇怪

时间:2015-03-29 12:01:54

标签: 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_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

现在正在努力,但我只是好奇为什么会发生这种情况。 谢谢,我希望不是真的很蠢。如果我不会感到惊讶,我必须去睡觉。

1 个答案:

答案 0 :(得分:3)

Python不支持从正在迭代的列表中删除元素。这正是您的第一个解决方案中发生的事情。

您可能会说您在list中复制了original_query = query,但事实并非如此。此行仅复制不产生和不同的参考。

如果您真的要复制输入

,那么您的第一个解决方案将有效
original_query = list(query)

或者只使用更有效和可读的单行

filtered = [word for word in query if len(word) > 3]