繁体   English   中英

如何“压缩”此代码?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM