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