2014-10-20 180 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