2012-01-10 21 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)