列表中的双打

时间:2013-03-20 19:25:25

标签: python

我今天接受了测试,其中一个问题是: 写入函数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

有人可以帮我弄明白怎么做吗?

6 个答案:

答案 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)

您不需要嵌套循环。对于每个元素,您只需要针对它前面的元素进行测试。