我怎样才能“压缩”这段代码?

时间:2013-11-20 14:40:41

标签: python variables global

我是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
嘿伙计们!感谢所有的回复!对于模糊的信息感到抱歉,所以感谢您回答我的问题。

4 个答案:

答案 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")