Python 来自不同元组的元素之和

Python 来自不同元组的元素之和,python,tuples,Python,Tuples,我需要创建一个可以接受元组列表和数字的函数。例子: 如果元组列表是[(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 = []

我需要创建一个可以接受元组列表和数字的函数。例子: 如果元组列表是
[(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)])
def转换(元组、索引):
值=[]#我将得到[(2,3,4,5,6),(8,9),(11,12,13,14,15,16,17,18,19),(22,43),(47,48,49,50)]
对于元组中的元组:
tupleValues=范围(元组[0],元组[1]+1)
扩展(tupleValues)#ex(2,3,4,5,6)

如果索引这里有一些东西可以让你开始。可以使其更加简洁,但我已尽力使其尽可能清楚。如果给定的元组无序,或者索引列表中没有索引,则还应该考虑要发生的事情。

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]
def valueAtIndex(元组,索引):
值=[]
对于元组中的元组:
#range(start,finish)返回从“start”开始到“finish-1”结束的整数列表,例如range(0,2)是[0,1]
tupleValues=范围(元组[0],元组[1]+1)
#Extend将一个列表中的所有元素添加到另一个列表的末尾,例如[0,1,2]。Extend(['a','b'])是[0,1,2',a','b']
扩展值(tupleValue)

如果索引这里有一些东西可以让你开始。可以使其更加简洁,但我已尽力使其尽可能清楚。如果给定的元组无序,或者索引列表中没有索引,则还应该考虑要发生的事情。

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]
def valueAtIndex(元组,索引):
值=[]
对于元组中的元组:
#range(start,finish)返回从“start”开始到“finish-1”结束的整数列表,例如range(0,2)是[0,1]
tupleValues=范围(元组[0],元组[1]+1)
#Extend将一个列表中的所有元素添加到另一个列表的末尾,例如[0,1,2]。Extend(['a','b'])是[0,1,2',a','b']
扩展值(tupleValue)

如果索引可以使用以下一行:

list(itertools.chain.from_iterable([range(start,end+1) for start, end in t]))[13]
其中
t
是问题中的元组列表

解决办法基本上是:

  • 为每个元组生成一个包含
    range
  • 将结果(列表列表)展平为列表
  • 找到你要找的元素
为了获得更多乐趣,更懒惰的解决方案是:

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

您可以使用以下一个衬里:

list(itertools.chain.from_iterable([range(start,end+1) for start, end in t]))[13]
其中
t
是问题中的元组列表

解决办法基本上是:

  • 为每个元组生成一个包含
    range
  • 将结果(列表列表)展平为列表
  • 找到你要找的元素
为了获得更多乐趣,更懒惰的解决方案是:

next(itertools.islice(itertools.chain.from_iterable(xrange(start,end+1) for start, end in t), 13, None))
这一行的作用是:

>>> 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
[(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

[(47,50),(22,43),(8,9),(2,5),(11,19)]
中的元组顺序不再重要。

如果我理解正确,您有一个区间序列,需要从这些区间中提取第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))

如果我理解正确,你有一系列的间隔,你需要从这些间隔中提取第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))

在对
转换的调用中,按相反顺序传递参数。

您应该调用
转换([(2,5),(8,9),(11,19),(22,43),(47,50)],14)
在调用
转换时,按相反顺序传递参数。


您应该致电
转换([(2,5),(8,9),(11,19),(22,43),(47,50)],14)

我无法理解您的问题..您能更清楚地解释您的问题吗?你到底想做什么?你能解释一下你是如何得到这个列表的吗
2,3,4,5,8,9…
?你是不是用元组列表来构建它的?你为什么把10放在列表中?听起来像是家庭作业。这样做会成为家庭作业帮助网站吗?显示一些代码和您迄今为止尝试的内容以及原因!我听不懂你的问题你能更清楚地解释一下你的问题吗?你到底想做什么?你能解释一下你是如何得到这个列表的吗
2,3,4,5,8,9…
?你是不是用元组列表来构建它的?你为什么把10放在列表中?听起来像是家庭作业。这样做会成为家庭作业帮助网站吗?显示一些代码和您迄今为止尝试的内容以及原因!看起来不错。由于询问者对Python来说似乎是新手,因此可能需要解释
range
extend
,因为它们是解决方案的核心。我无法让它工作。它说:TypeError:“int”对象是不可编辑的,因为行:对于元组中的元组:这可能是因为你没有给出[(2,5),(8,9),(11,19),(22,43),(47,50)]作为参数,但有些东西是不正确的。说你在做什么。更明确、更详细!实际上,听起来你在调用它时,参数是颠倒的。请确保您没有像上面那样定义它,并将其称为“valueAtIndex(1,[(1,2),(4,6)]”看起来不错。由于询问者对Python来说似乎是新手,因此可能需要解释
range
extend
,因为它们是解决方案的核心。我无法让它工作。它说:TypeError:“int”对象是不可编辑的,因为行:对于元组中的元组:这可能是因为你没有给出[(2,5),(8,9),(11,19),(22,43),(47,50)]作为参数,但有些东西是不正确的。说你在做什么。更明确、更详细!实际上,听起来你在调用它时,参数是颠倒的。请确保您不是像上面那样定义它,而是像“valueAtIndex(1,[(1,2),(4)”那样调用它