2011-11-29 236 views
2

我有一个说两个值的列表,然后我应该将每个值乘以一个整数,直到两个元素都变为整数并将这些新值附加到新列表。假设我有一个列表[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 

回答

2

看起来你应该清除alistwhile循环内,否则每个通过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] 
0

我kindof有以下代码的麻烦,在这里,你这是怎么能做到这一点:

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 
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 
+0

谢谢大家,'就像F.J.说的,我只是把alist放在while循环中,它的工作很完美。这种微小的变化对你的程序有多大的影响是惊人的。再次感谢,非常感谢! – user1036197

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)