2011-11-29 235 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)