Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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_List Comprehension - Fatal编程技术网

Python 如何知道我什么时候可以';不使用列表理解?

Python 如何知道我什么时候可以';不使用列表理解?,python,list-comprehension,Python,List Comprehension,所以我在麻省理工学院compsci 6.00.1班,在做手指练习和问题时,我尽量使用列表理解,到目前为止我已经能够做到 从我所做的阅读中可以看出,你总是可以从理解中编写一个for循环,但不是每个for循环都可以与理解一起使用 我想知道我什么时候不能,什么时候可以?我是否必须写下循环,然后试着理解它,看看它是否有效?在我试图理解它之前,有没有办法知道呢 例如: def getAvailableLetters(lettersGuessed): from string import asci

所以我在麻省理工学院compsci 6.00.1班,在做手指练习和问题时,我尽量使用列表理解,到目前为止我已经能够做到

从我所做的阅读中可以看出,你总是可以从理解中编写一个
for
循环,但不是每个
for
循环都可以与理解一起使用

我想知道我什么时候不能,什么时候可以?我是否必须写下循环,然后试着理解它,看看它是否有效?在我试图理解它之前,有没有办法知道呢

例如:

def getAvailableLetters(lettersGuessed):

    from string import ascii_lowercase as letters

    letter_list = list(letters)
    for x in lettersGuessed:
        if x in letter_list:
            letter_list.remove(x)
    return ' '.join(letter_list)

print(getAvailableLetters(['a', 'b', 'x', 'z']))
理解:

def getAvailableLetters(lettersGuessed):

    from string import ascii_lowercase as letters

    letter_list = list(letters)
    return ''.join(x for x in lettersGuesseed for x in letter_list if letter_list.remove(x))

print(getAvailableLetters(['a', 'b', 'x', 'z']))
现在,当我尝试理解时,它(我的IDE,pycharm)说第二个x是“未使用的局部变量”,而LettersGuesed是“未解析的引用”

这是我不能理解的一次吗?如果是这样的话,我怎么能不写出来就知道呢

这是我不能理解的一次吗

不,这里有几个问题:

  • lettersguessed
    有打字错误
  • 你的理解没有意义。为什么要使用
    字母列表。在
    if
    中删除(x)
在所有修复之后,这将作为原始代码工作:

def getAvailableLetters(letters_guessed):

    from string import ascii_lowercase as letters

    letter_list = list(letters)
    return ' '.join([x for x in letter_list if x not in letters_guessed])

print(getAvailableLetters(['a', 'b', 'x', 'z']))
输出:

c d e f g h i j k l m n o p q r s t u v y


第一个示例从列表中删除字母。此时您没有生成列表,因此循环不适合转换为列表理解。旁注:您的第二个版本不是理解,而是生成器表达式。但是,同样的原则也适用。@Martjinpeiter在列表中列出了这个
如果字母。在列表理解中删除(x)
,它总是返回
None
。正确的列表组合应该是
letter_list=“”。加入([x代表x,如果x不在letter_list中,则使用x])
。您的第一个示例可以转换为构建列表的示例,而不是修改现有列表。只需在附加元素时进行筛选:
result=[]
,然后对字母列表中的字母进行
:如果字母不在字母中,则使用:result.append(字母)
。现在您有了一个可以转换的模式。一般的经验法则是列表理解应该只用于构建列表。其他任何操作都将被视为不好的做法(例如,使用列表理解来产生副作用)或不可能实际执行(例如,尝试(重新)分配列表中对象的某些属性)。另外请注意,如果你的列表理解开始变得不可读,最好只使用普通的for-loop。这修复了OP的代码,但它并没有真正回答问题的核心-什么时候可以使用列表理解而不是普通的for-loop?@ChristianDean我同意,它回答了这一特定部分“这是我不能理解的一次吗?“.我会解决问题的谢谢大家的解释,他们都很有帮助@克里斯蒂安谢谢你指出原来的问题,这个问题只回答了一半。如何让它工作,是的,但不是我该如何知道它是否会工作。可能只是更多的经验和编码。很高兴我能帮助传播一些知识@emetib:-)