我今天接受了测试,其中一个问题是: 写入函数doubles(),它将整数列表作为输入,并输出列表中的整数,这些整数恰好是列表中前一个整数的两倍,每行一个。
我无法弄清楚我的代码究竟是如何做到的
def doubles(x):
for a in range(len(x)-1):
for b in (range(a,len(x))):
if x[a]*2==x[b]:
print(b)
例如双打([3,0,1,2,3,6,2,4,5,6,5])将打印2,6,4
有人可以帮我弄明白怎么做吗?
答案 0 :(得分:1)
您的代码是将每个值与稍后在列表中显示的所有值进行比较。但问题是要求您仅考虑相邻对。
所以,你只需要走一次列表。像这样:
def doubles(x):
for i in range(1, len(x)):
if x[i] == 2*x[i-1]:
print x[i]
更重要的是,你的代码打印了索引而不是值,这是我在上面修复的错误。
答案 1 :(得分:1)
您只需要查看一次列表,然后使用之后的一个元素或之前的元素测试每个元素。
以下示例使用后面的数字测试每个数字,并在最后一个数字前停止。
def doubles(x):
for i,a in enumerate(x[:-1]):
if x[i+1] == a*2:
print a*2
答案 2 :(得分:1)
def doubles(lst):
prev = None
for actual in lst:
if prev is not None and actual == 2*prev:
print actual
prev = actual
答案 3 :(得分:1)
这可以很简单地完成:
def doubles(seq):
after = seq[1:]
for previous, current in zip(seq, after):
if current == previous * 2:
print(current)
按预期工作:
>>> print(list(doubles([3, 0, 1, 2, 3, 6, 2, 4, 5, 6, 5])))
2
6
4
我们从列表中获取一个列表来获取第二个值的列表。然后,我们使用zip()
循环使用前一个值,并简单地执行检查,并在匹配时打印该值。
您也可以将print()
替换为yield
(这通常是更好的选择),或者如果您真的想要一个列表,那么也可以将其构建为生成器:
def doubles(seq):
after = seq[1:]
return [current for previous, current in zip(seq, after)
if current == previous * 2]
答案 4 :(得分:1)
最简单的方法是使用一个元素移位压缩并检查元素对的条件
>>> def doubles(x):
return [b for a,b in zip(x,x[1:]) if b == 2*a]
>>> for e in doubles([3,0,1,2,3,6,2,4,5,6,5]):
print e
2
6
4
类似的解决方案,但只使用迭代器
>>> def doubles(x):
it1, it2 = tee(x)
next(it2)
return [b for a,b in izip(it1,it2) if b == 2*a]
>>> for e in doubles([3,0,1,2,3,6,2,4,5,6,5]):
print e
2
6
4
答案 5 :(得分:0)
您不需要嵌套循环。对于每个元素,您只需要针对它前面的元素进行测试。