Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表的行为很奇怪_Python_Python 2.7 - Fatal编程技术网

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的优秀文章