2014-10-20 104 views
0

我试图创建一个函数,该函数返回沿其左侧的所有元素的总和大于数字x的最小元素的索引。使用列表元素的总和查找列表的索引

我该如何以Pythonic的方式做到这一点?

例子:

我有一个数字[32, 6, 12]的名单,我试图让一个函数将返回0如果x < 321如果x < 32 + 62如果x < 32 + 6+ 12

非Python的方式将是:

a = [23,3,32] 
i = 0 
summ = 0 
found = False 

def example(e): 
    while not found: 
     if e <= (a[i] + summ): 
      found = True 
      element = i 
     else: 
      summ += a[i] 
      i += 1 

    return element 
+0

究竟什么是你的问题? – jonrsharpe 2014-10-20 11:23:11

+0

@jonrsharpe如何以pythonic的方式做到这一点 – confused00 2014-10-20 11:23:57

+0

这不是一个代码写作服务;如果你想检查你的代码(*假设它已经过测试并正在工作*),请尝试http://codereview.stackexchange.com。 – jonrsharpe 2014-10-20 11:24:48

回答

1

钍ERE是做这是一个非常不错的功能性的方式:

import itertools 
import operator 

xs = [32, 6, 12] 
target = 5 

next(i for i, x in enumerate(itertools.accumulate(xs, operator.add)) if x > target) 

在它提出StopIteration列表的末尾。

4
def find_index(a, x): 
    for i, e in enumerate(a): 
     x -= e 
     if x < 0: 
      return i 
    return i 
+0

不错 - 但是最好在列表末尾返回None吗?还是-1?或举一个例外? – xorsyst 2014-10-20 11:34:53

+1

@xorsyst你说得对,但我不确切知道OP在这种情况下需要什么。 – laike9m 2014-10-20 11:36:30

+0

+1考虑到请求的不透明性质,可以做出很好的努力。 – 2014-10-20 11:38:44

0

找到不同的解决方案

>>> xs = [18,30,307] 
>>> element = 40 
>>> target = [sum(xs[:i+1]) for i, elem in enumerate(xs)] 
>>> target.index((i for i in target if i>element).next()) 
1 

带过滤器

>>> target.index(filter(lambda x: x > element, target)[0]) 
1 

带过滤器+发电机

>>> import itertools 
>>> target.index(itertools.ifilter(lambda x: x > element, target).next()) 
1