我有一个包含项目成本值的列表。列表c
表示项目在第1年开始(假设为c[0] = year 1
,在第3年暂停,并在第4年结束时完成。因此,第5年没有相关费用。
c = [3000000.0, 3000000.0, 0.0, 200000.0, 0.0]
从列表中,我想找到项目长度,基本 4
不 3
在上面的例子中基于我的编程方式。如果列表如下:
d = [3000000.0, 3000000.0, 100000.0, 200000.0, 0.0]
我可以通过以下方式解决我的问题:
输入:
cc = 0
for i in d:
if i>0:
cc += 1
输出:
cc = 4
然而,当两年之间出现暂停(差距)时,它确实不起作用。有什么建议让它发挥作用吗?
答案 0 :(得分:2)
因此,您希望在列表中找到最后0
的位置。
看this question
我认为上述链接的最佳方法是:
last_0 = max(loc for loc, val in enumerate(c) if val == 0)
您还可以计算第一个0
:
first_0 = min(loc for loc, val in enumerate(c) if val == 0)
他们的区别在于长度。
在一个区块中:
zeros_indices = [loc for loc, val in enumerate(c) if val == 0]
length = max(zeros_indices) - min(zeros_indices)
答案 1 :(得分:1)
如果你想找到最后一个不是0的索引+ 1(索引开始为0),你可以这样做:
>>> c = [3000000.0, 3000000.0, 0.0, 200000.0, 0.0, 0.0]
>>> cc=[c.index(i) for i in c if i!=0][-1]+1
>>> cc
4
编辑:
您可以使用numpy
不考虑列表中的前0:
>>> c = [0.0, 0.0, 3000000.0, 3000000.0, 0.0, 200000.0, 0.0, 0.0]
>>> import numpy as np
>>> np.trim_zeros(c)
[3000000.0, 3000000.0, 0.0, 200000.0]
>>> len(np.trim_zeros(c))
4
答案 2 :(得分:0)
您可以向后查看列表,直到找到值大于零的元素的索引,如果您向该索引添加一个索引,则它将是允许间隙的年份长度。
答案 3 :(得分:0)
要在计算中包含缺口年数,您可以检查当前项目是否不是列表中的最后一项。
你最好通过迭代索引而不是元素来避免在每次迭代时找到你在列表中的位置。
cc = 0
for i in xrange(len(c)):
if c[i] > 0 and i < (len(c) - 1):
cc += 1
xrange
函数从list
到0
生成len(c)
。您可以改为使用range
,但range
会将生成的列表保留在内存中,而xrange
则不会。
编辑:这不会在列表c
答案 4 :(得分:0)
c = [3000000.0, 3000000.0, 0.0, 0.0, 200000.0, 0.0]
cc = 0
templength = 0
for i in reversed(c):
if i == 0:
templength += 1
else:
break
print (len(c)-templength)
输出:
5