2017-06-05 247 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