List返回的值多于预期值

时间:2011-11-29 18:59:24

标签: python list

我有一个说两个值的列表,然后我应该将每个值乘以一个整数,直到两个元素都变成整数并将这些新值附加到一个新列表。假设我有一个列表[0.5,1],应该发生的是我将每个乘以2得到1和2并将它们附加到新列表[1,2]。对于我编写的代码,当我应该得到两个时,我在新列表中得到四个值(!),代码中的错误在哪里?

    u=1
    newlist = [1, 0.5]
    alist = []
    while True:

        cont = True

        for value in newlist:

            w = value*u
            rounded = round(w)
            alist.append(rounded)



            if not (abs(rounded - w)<=0.1):
                cont = False
        if cont:
            break
        u+=1

4 个答案:

答案 0 :(得分:2)

看起来您应该在alist循环内清除while,否则每次运行for循环都会将len(newlist)项追加到alist不删除alist的前一个元素。

u = 1 
newlist = [1, 0.5]
while True:
    alist = []
    cont = True
    for value in newlist:
        w = value*u
        rounded = round(w)
        alist.append(rounded)
        if not abs(rounded - w) <= 0.1:
            cont = False
    if cont:
        break
    u += 1

>>> alist
[2.0, 1.0]

答案 1 :(得分:1)

您获得四个值的原因是因为您在几个循环的过程中使用相同的列表,并且您继续向同一个列表添加元素。除此之外,您的代码中还有一些错误,我认为如果我向您展示一个可用的版本并且您想出它们会更简单:

u = 1
newlist = [1, 0.5]
alist = []

while True:
    cont = True
    alist = []
    for value in newlist:
        w = value*u
        if int(w) != w:
            cont = False
            break
        alist.append(int(w))
    if cont:
        break
    u += 1

答案 2 :(得分:0)

我很难跟踪你的代码,在这里,你可以这样做:

vals = [1,0.5]
i=1

while 1:
        if (vals[0] * i) % 1.0 == 0:
                if (vals[1] * i) % 1.0 == 0:
                        print i
                        vals[0] = vals[0]*i
                        vals[1] = vals[1]*i
                        print vals
                        break
        i+=1

答案 3 :(得分:0)

使用函数可以使事情更容易理解。这是一次尝试。

def nearly_int(x):
    return abs(x - round(x)) < 0.1

def find_multiple(a, b):
    u = 1
    while not nearly_int(a * u) or not nearly_int(b * u):
        u += 1
    return [round(a * u), round(b * u)]

newlist = [1, 0.5]
alist = find_multiple(*newlist)