操纵列表理解

时间:2015-07-22 14:20:12

标签: python list

我有三个列表来表达我的条件,即如果b等于1然后我想找到c低于a的第一个元素,那么我可以得到这两个索引减去它们,那就是时间。

    a = [1.373, 1.374, 1.374, 1.385, 1.385, 1.385, 1.374, 1.374]
    b = [0, 1, 1, 0, 0, 0, 0, 0]
    c = [0, 1.384, 1.385, 1.377, 0, 0, 0, 0]

   view = [(nx, x, nz, z, nl, l) for nx, x in enumerate(a)
           for nl, l in enumerate(b) for nz, z in enumerate(c)
           if (l == 1) & (nz <= nx) & (z > 0) & (z <= x) & (nz == nl)]

我创建了一个简单的视图列表,显示了所有参数以便更好地理解。 然而,当我这样做时,我得到所有数字,当c较低时,我只想要第一个元素......我希望只看到[(3, 1.385, 1, 1.384, 1, 1), (3, 1.385, 2, 1.385, 2, 1)],我得到了:

[(3, 1.385, 1, 1.384, 1, 1), (3, 1.385, 2, 1.385, 2, 1), (4, 1.385, 1, 1.384, 1, 1), (4, 1.385, 2, 1.385, 2, 1), (5, 1.385, 1, 1.384, 1, 1), (5, 1.385, 2, 1.385, 2, 1)]

time = [(nx - nz) for nx, x in enumerate(a)
        for nl, l in enumerate(b) for nz, z in enumerate(c)
        if (l == 1) & (nz <= nx) & (z > 0) & (z <= x) & (nz == nl)]

当条件成立时,我怎样才能得到第一个元素?

1 个答案:

答案 0 :(得分:2)

没有列表理解且时间复杂度更高的解决方案:

a = [1.373, 1.374, 1.374, 1.385, 1.385, 1.385, 1.374, 1.374]
b = [0, 1, 1, 0, 0, 0, 0, 0]
c = [0, 1.384, 1.385, 1.377, 0, 0, 0, 0]

for y_i, y in enumerate(b):
    if y == 1:
        for x_i, x in enumerate(a):
            if x >= c[y_i]:
                # all prints are zero based indexes
                print "iteration {}, x: {}, x index: {} c: {}, c index {}".format(y_i, x, x_i, c[y_i], y_i)
                break

输出:

iteration 1, x: 1.385, x index: 3 c: 1.384, c index 1
iteration 2, x: 1.385, x index: 3 c: 1.385, c index 2

有时候,当你得到算法时,更容易从普通循环开始,然后你可以使它成为更好的代码,而且不需要3个语句。