2017-02-21 143 views
2

我们有一个列表如何计算列表中元素之前的特定元素?

list = [1, 1, 1, 0, 1, 0, 0, 1] 

我试图找到将统计每个项目之前的0的号码,然后通过3

def formula(n): 
    for x in list: 
     if x == 1: 
      form = n * 3 
      return form 
#If x is 1, count the number of zeros right before x and multiply this by 3, 

这个数字乘以例如,对于上面的列表功能,第一个元素是1,并且在它之前没有数字,程序应该计算0 * 3 = 0,对于第二个元素,它也是1,在它也不是零之前的数字,程序也应该计算0 * 3 = 0.第四个元素是0,所以程序应该忽略,对于第五个元素是1,它之前的数字是一个0,计算1 * 3 = 3的程序,对于第6个元素,其右边的数字是1之前,系统应该计算0 * 3 = 0.第7个元素是0,因为x不等于1该程序不应该做任何事情。对于这是1的最后一个元素,最后两个数字前都为零,程序应该计算2 * 3 = 6

+0

为什么你跳过第7个元素? –

+0

Uriel Eld的答案使用了一个发电机,而sparkandshine使用了一个列表,使用一个你感觉更舒适的发电机,虽然 – Adirio

+0

谢谢你的纠正摩西 –

回答

1

试试这个,

def formula(l): 
    count_zero = 0 
    result = [] 

    for i in l: 
     if i == 1: 
      result.append(3*count_zero) 
      count_zero = 0 
     elif i == 0: 
      count_zero += 1 

    return result 

# Test case 
l = [1, 1, 1, 0, 1, 0, 0, 1] 
result = formula(l) 
print(result) 
# [0, 0, 0, 3, 6] 
+0

我编辑你的答案将结果添加到列表中,请接受它。 – Adirio

+0

@Adirio,我做到了。 – SparkAndShine

+0

嗨,我想调整results.append的一部分公式,我有问题:result.append(max(3 + count_zero),0),当我将最大值添加到公式我得到一个结果说:TypeError:'int'对象不可迭代。我如何纠正这一点,谢谢。 –

3

我相信你正在寻找一个发电机,用一个简单的计数器:

def get_values (list): 
    n = 0 
    for x in list: 
     if x == 1: 
      yield n * 3 
      n = 0 # reset the counter 
     elif x == 0: 
      n += 1 # increment the counter 

print(list(get_values([1, 1, 1, 0, 1, 0, 0, 1]))) 
# [0, 0, 0, 3, 6] 
1

这是我对这个问题的解决方案。

test_list = [1, 1, 1, 0, 1, 0, 0, 1] 


def formula(list): 
    track = [] 
    start = 0 

    for i,n in enumerate(list): 
     count_list_chunk = list[start:i] 
     if count_list_chunk.count(0) > 0 and n != 0: 
      start = i 

     if n != 0: 
      track.append(count_list_chunk.count(0)*3) 

    return track 

print formula(test_list) 
#[ 0, 0, 0, 3, 6]