2017-06-05 110 views
-2

我在我的Python代码中出现错误。这是代码我不明白为什么我的变量超出范围

binary=[] 
bits=int(input("How many bits do you want to have? >>")) 
numOfCombos=2**bits 
lenOfPart=numOfCombos/2 
x=0 
y=0 
z=0 
while x!=numOfCombos: 
    binary.insert(x,[]) 
    x+=1 
x=0 
while x!=lenOfPart: 
    binary[x].insert(0,"0") 
    x+=1 
while x!=lenOfPart*2: 
    binary[x].insert(0,"1") 
    x+=1 
x=0 
p=0 
while x!=bits: 
    lenOfPart=lenOfPart/2 
    while z!=len(binary)-1: 
     while p!=lenOfPart: 
      binary[y].insert(len(binary[y]),"0") 
      y+=1 
      p+=1 
     p=0 
     while p!=lenOfPart: 
      binary[y].insert(len(binary[y]),"1") 
      y+=1 
      p+=1 
     p=0 
     z+=1 
    y=0 
    x+=1 

print(numOfCombos) 
print(len(binary)) 
print(binary) 

我得到读取

How many bits do you want to have? >>3 
Traceback (most recent call last): 
    File "C:/Users/#####/AppData/Local/Programs/Python/Python36-32/binarygen.py", line 24, in <module> 
    binary[y].insert(len(binary[y]),"0") 
IndexError: list index out of range 

我不明白为什么我的变量不工作的错误。我测试了所有我能想到的东西。如果您有任何建议,请尽快回复。如果你认为整个程序是错误的,请在你的答案中插入一个工作版本。该程序的目的是为给定的位数生成所有可能的二进制组合。感谢您的时间和帮助。

+0

什么是你试图做一个双重嵌套的循环可能不是正确的方式,因为它根本没有规模 – e4c5

+1

你给了我们整个程序(而不是一个MCVE),没有评论,没有设计描述,并没有你的调试尝试的结果。请不要指望我们用单字母变量名称来逆向设计您的设计,并且没有任何帮助。 – Prune

+0

你可以添加一些输入及其预期输出的例子吗? –

回答

1

你在这个循环的 “关一个” 错误。您试图在binary(我认为)的最后一个元素的末尾添加一个字符。但是,对于输入3,则使用下标8(2 ** 3)。二进制有元素0-7;下标8超出界限。也许你需要

 binary[y].insert(len(binary[y])-1,"0") 

然而,我注意到,你总是插入在列表的末尾。为什么不简单地使用append

 binary[y].append("0") 

更棒的,而不是人物的名单,使每一个字符串:

 binary[y] += "0" 

另外,请注意在Python中的复制功能;你不需要那些乏味的while循环:只需要添加尽可能多的1或0就可以了。例如:

binary += "0" * (lenOfPart" - p) 

一旦你学习了一些语言设施,你可以简化很多。

最重要的是,在上层弄明白真的需要做什么。告诉我们;你可以简单地解决问题和解决方案。例如,如Delirious Lettuce所示,通过在itertools包中搜索的第一个以获得内置功能,您可以切入很多悲伤。

+0

非常感谢。为了回答你的问题,我出于可读性的目的使用它。 –

+0

我相信你会发现你的大部分队友发现'append'更易于阅读。我希望你也能很快看到它。指定位置的开销会使大多数程序员更难。 – Prune

+0

我按照你所说的将它改为一个字符串。我得到了以下错误。假设代码是相同的,除了插入是'binary [y] + =“0”或'binary [y] + =“1”'这是错误: '你想要多少位>> 3 回溯(最近呼叫最后一次): 文件“C:/Users/broke/AppData/Local/Programs/Python/Python36-32/binarygen.py”,第24行,在 binary [y ] + =“0” IndexError:列表索引超出范围' –

0
from itertools import product 


def generate_combinations(n): 
    return [''.join(p) for p in product('10', repeat=n)] 


if __name__ == '__main__': 
    bits = int(input('How many bits do you want to have? ')) 
    print(generate_combinations(bits)) 

>>> generate_combinations(1) 
['1', '0'] 
>>> generate_combinations(2) 
['11', '10', '01', '00'] 
>>> generate_combinations(3) 
['111', '110', '101', '100', '011', '010', '001', '000'] 
+0

我正在尝试根据输入生成所有组合。这对我不起作用。 –

+1

@JimmyMCJames你还没有给出任何输入和预期输出的例子。此代码可以很容易地修改为接受输入。如果您显示几个输入/输出示例,那么帮助您会容易得多。 –

0

循环停止在错误的时间。我不需要停在bits,我需要它停在bits-1