Python列表附加True布尔值

时间:2016-05-30 11:18:24

标签: python list boolean append

以下[不完整]代码旨在将 n 引入 x 数字,长度为 xn ,并返回值下一个pandigital数字。代码识别作为函数参数传入的数字中缺少 n x 之间的数字,并返回(暂时,直到函数更进一步开发),两个列表,原始数字本身及其各个数字作为列表成员,以及一个列表,其中数字为 n x 作为成员,具有这些数字原始长度 xn 中存在的值由布尔值 True 替换。

def nextPandigital(n,lower,upper):
    digits = []
    requiredDigits = []

    #Completed loop
    for digit in str(n):
    digits.append(int(digit))

    #Completed loop
    for num in range(lower,upper+1):
    requiredDigits.append(num)

    for number in requiredDigits:
        if str(number) in str(digits):
            x = requiredDigits.index(number)
            #requiredDigits[x] = 'True'
            requiredDigits[x] = True
    return digits, requiredDigits

虽然,对于Enthought Canopy中 nextPandigital(1023456789,0,9) 的输入参数,返回的第二个列表应为 [True,True,True,True,True,True,True,True,True,True] ,第二个值事实上 [True,1,True,True,True,True,True,True,True,True] ,其中原来的 requiredDigits 列表中的1未被 True替换

我知道,当评论 requiredDigits[x] = True 代码行时,循环或代码的一般流程没有问题,并且当前注释的代码未被注释,代码按预期工作, requiredDigits 中的所有数字都被字符串值“True.”替换

我试图解决此问题。但是,我无法确定其来源。我已经考虑过 True == 1 返回True。但是,当值True替换为False时,在 requiredDigits[x] = True 行中,代码仍然按预期工作。

对此问题的任何答复/帮助/建议/建议都将受到高度赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您正在检查要更新的同一列表,始终危险。

在第二次迭代中,你的变量是:

number=1
requiredDigits = [True, 1, 2, 3, 4, 5, 6, 7, 8, 9]

因此,当您执行requiredDigits.index(1)时,匹配但未达到1,因为它发生在True==1中,因此返回索引0

但总的来说,这种实现并不太多pythonic,更好地检查Blckknght's answer

答案 1 :(得分:0)

问题在于使用index查找要分配的位置。由于True等于1,因此您错误地认为您为True输入的0是您要替换的1

解决方案是在迭代列表时使用enumerate获取索引,而不是需要稍后使用index找到它们:

for x, number in enumerate(requiredDigits):
    if str(number) in str(digits):
        requiredDigits[x] = True

一般来说,更好的解决方案是使用列表推导来一次创建列表,而不是从数字开始并稍后替换其中的一些:

requiredDigits = [True if num in digits else num for num in range(lower,upper+1)]

我还在针对str的成员资格测试中摆脱了对digits的不必要的调用。您正在进行子字符串测试,而不是测试数字本身是否在列表中。这可能不会导致错误,因为您关心的数字都是一位数长,并且列表的字符串表示没有任何无关数字。但总的来说,当你不需要时,使用字符串操作不是一个好主意。