我不明白为什么我的变量超出范围

2024-09-30 05:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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

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


Tags: toyoulen错误domanybitshow
3条回答
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']

循环中有一个“off by one”错误。您试图在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包中搜索first来消除很多悲伤。你知道吗

环路在错误的时间停止。我需要它停在bits-1,而不是停在bits。你知道吗

相关问题 更多 >

    热门问题