我有三个列表来表达我的条件,即如果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)]
当条件成立时,我怎样才能得到第一个元素?
答案 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个语句。