[英]How can I “condense” this code?
我是python的新手,所以我可能使用了错误的术语,但是如何“压缩”此代码?
for i in self.letterWord[0:1]:
if i == letter:
self.binaryWord[0] = 1
for i in self.letterWord[1:2]:
if i == letter:
self.binaryWord[1] = 1
for i in self.letterWord[2:3]:
if i == letter:
self.binaryWord[2] = 1
看起来像这样吗?
for i in self.letterWord[i:i+1]:
if i == letter:
self.binaryWord[i]=1
我尝试使用上面的代码,但一直在说
local variable 'i' referenced before assignment
然后,当我输入global i
,它说
global name 'i' not defined
大家好! 感谢您的所有回复! 抱歉,您的信息含糊不清,因此,无论如何,感谢您回答我的问题。
问题所在
for i in self.letterWord[i:i+1]:
if i == letter:
self.binaryWord[i]=1
是在将i
用作列表迭代器之前,需要查询i
以评估self.letterWord[i:i+1]
,所以这是错误的根源。
尝试这样的事情:
for i, ltr in enumerate(self.letterWord):
if ltr == letter:
self.binaryWord[i] = 1
甚至更好(如果可能,在一行代码中创建self.binaryWord
)
self.binaryWord = [ 1 if ltr == letter else 0 for ltr in self.letterWord ]
使用现有的设置,纯粹是为了压缩代码,您可以执行以下操作:
for idx, val in enumerate(self.letterWord[:3]):
if val == letter:
self.binaryWord[idx] = 1
虽然您可能可以使用其他方法来构建这些对象,例如列表压缩/将它们压缩在一起/等等。
首先,建议的代码使用i
来表示两种不同的含义。 如果有的话,它将是:
for l in self.letterWord[i:i+1]:
if l == letter:
self.binaryWord[i]=1
而且,self.letterWord [0:1]将只包含一项:self.letterWord [0]。 如果超出范围,则什么也不做。 因此,您根本不需要这些for循环。
if len(self.letterWord) < i and self.letterWord[i] == letter:
self.binaryWord[i] = 1
您将其更改为将i用作索引; 这是否意味着存在外部循环? 如果您遍历letterWord的长度,则不需要我添加的len支票。
for i in range(len(self.letterWord)):
if self.letterWord[i] == letter:
self.binaryWord[i] = 1
同样,循环遍历列表的索引也不是最佳实践,如果需要索引,请使用enumerate
。
for i, l in enumerate(self.letterWord):
if l == letter:
self.binaryWord[i] = 1
而且,如果您现在正在创建binaryWord(不显示其创建方式),则可以将其创建为列表理解:
self.binaryWord = [int(l == letter) for l in self.letterWord]
# int(True) is 1, int(False) is 0
一排解决方案
self.binaryWord = "%s%s" % (self.binaryWord[:3].replace(letter, "1"), self.binaryWord[3:])
而且,如果您要更改所有字母,可以执行以下操作
self.binaryWord = self.binaryWord.replace(letter, "1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.