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