2012-01-10 46 views
0

我需要創建一個函數,該函數可以接受元組和列表。例如: 如果元組的列表是[(2,5),(8,9),(11,19),(22,43),(47,50)],並且數量爲14時,它應該返回18. 這樣做的原因是,在13號在列表2,3,4,5,8,9,11,12,13,14,15,16,17,18,19...是18,如果包括的所有數字:來自不同元組的元素總和

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18. 

我現在有:

def converting(tuples,index): 
    values = [] #I will get [(2,3,4,5,6),(8,9),(11,12,13,14,15,16,17,18,19),(22,..,43),(47,48,49,50)] 
    for tuple in tuples: 
     tupleValues = range(tuple[0], tuple[1]+1) 
     values.extend(tupleValues) #ex(2,3,4,5,6) 
    if index <= len(values): #If 14 in the example is lower than len of the list, eg 42 
     return values[index-1] #return value of 14-1, which is 16? 
print converting(14,[(2,5),(8,9),(11,19),(22,43),(47,50)]) 

當我打印此我得到的消息: 在元組的元組: 類型錯誤:「詮釋」對象不是可迭代

+4

我不明白你的問題.. – 2012-01-10 13:32:19

+2

你能否更清楚地解釋你的問題/問題?你真的想做什麼? – 2012-01-10 13:32:20

+1

你能解釋一下你是如何得到'2,3,4,5,8,9 ...'列表嗎?你有沒有使用元組列表來構造它? – Kevin 2012-01-10 13:33:26

回答

0

如果我正確地理解了這個問題,你有一系列的時間間隔,你需要從這些時間間隔中提取第n個數字。這是關於所用算法的不同解決方案。剛剛從你的間隔順序計數所有丟失號碼,並把它添加到你的價值:

tuples = [(2,5),(8,9),(11,19),(22,43),(47,50)] 
#tuples = [(2,7),(9,14),(17,20)] 

def result(tuple, value): 
    start = tuples[0][0] - 1 
    for idx in range(len(tuples) - 1): 
     if tuples[idx][1] >= value + start: 
      break 
     start = start + (tuples[idx+1][0] - tuples[idx][1] - 1) 
    return value + start 

for i in range(1, 16): 
    print str(i) + ' ' + str(result(tuples, i)) 
+0

這是行得通的,但是當我使用另一個例子時,它沒有。例如,結果(13,[(2,7),(9,14),(17,20)])應返回17,但返回15! – 2012-01-10 14:39:26

+0

對不起,我的錯誤在停止條件。用新解決方案進行編輯。 – Bogdan 2012-01-10 15:04:08

3

她e是讓你開始的東西。它可以做得更簡潔,但我儘量使其儘可能清晰。如果給定的元組亂序出現,或者索引在值列表中不可用,您還應該考慮想要發生什麼。

def valueAtIndex(tuples, index): 
    values = [] 
    for tuple in tuples: 
    #range(start, finish) returns a list of integers starting at 'start' and ending at 'finish-1' e.g. range(0, 2) is [0, 1] 
    tupleValues = range(tuple[0], tuple[1]+1) 
    #Extend adds all of the elements from one list to the end of the other e.g. [0, 1, 2].extend(['a', 'b']) is [0, 1, 2, 'a', 'b'] 
    values.extend(tupleValues) 
    if index <= len(values): 
     return values[index-1] 
+1

看起來不錯。由於提問者似乎對Python很陌生,因此可能值得解釋'range'和'extend',因爲他們是解決方案的核心。 – 2012-01-10 13:39:47

+0

我無法讓它工作。它說:TypeError:'int'對象不可迭代,對於行:對於元組中的元組: – 2012-01-10 14:04:34

+0

這可能是因爲你沒有給出[(2,5),(8,9),(11,19),(22 ,43),(47,50)]作爲一個參數,但事端。說你在做什麼。更明確和詳細! – 2012-01-10 14:08:41

0

您可以使用下面的一行代碼:

list(itertools.chain.from_iterable([range(start,end+1) for start, end in t]))[13] 

其中t元組是在你的問題的列表。

的解決方案基本上是:

  • 產生的每條記錄它們包括range
  • 拼合結果(名單列表)的元素添加到列表
  • 列表獲取elemnet你」重新尋找

更多的樂趣,一個懶惰的解決辦法是:

next(itertools.islice(itertools.chain.from_iterable(xrange(start,end+1) for start, end in t), 13, None)) 
2

此單行作品:[(47,50),(22,43),(8,9),(2,5),(11,19)]

>>> sorted(reduce(lambda x,y:x.union(set(y)), map(lambda r:range(r[0], r[1]+1), [(2,5),(8,9),(11,19),(22,43),(47,50)]), set()))[13] 
18 

元組的順序並不重要了。

+0

好打高爾夫球;) – filmor 2012-01-10 13:50:36

+0

打高爾夫球, – 2012-01-10 13:58:07

0

在您的來電converting,你傳遞的參數順序相反。
你應該打電話converting([(2,5),(8,9),(11,19),(22,43),(47,50)], 14)