我是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
嘿伙计们!感谢所有的回复!对于模糊的信息感到抱歉,所以感谢您回答我的问题。
答案 0 :(得分:2)
的问题
for i in self.letterWord[i:i+1]:
if i == letter:
self.binaryWord[i]=1
是在i
用作列表迭代器之前需要查找self.letterWord[i:i+1]
以评估i
,因此这是错误的来源。
尝试这样的事情:
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 ]
答案 1 :(得分:1)
使用现有的设置,纯粹是为了压缩代码,你可以这样做:
for idx, val in enumerate(self.letterWord[:3]):
if val == letter:
self.binaryWord[idx] = 1
虽然你可以使用其他方法来构建这些对象,例如list-comps /将它们压缩在一起等等......
答案 2 :(得分: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
答案 3 :(得分:1)
一行解决方案
self.binaryWord = "%s%s" % (self.binaryWord[:3].replace(letter, "1"), self.binaryWord[3:])
如果你想改变行中的所有字母,你可以做这样的事情
self.binaryWord = self.binaryWord.replace(letter, "1")