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

Когда я печатаю это, я получаю сообщение: для кортежа в кортежах: TypeError: «INT» объект не итерацию

+4

Я не понимаю ваш вопрос .. –

+2

Не могли бы вы объяснить более подробно ваш вопрос/проблему? Что вы на самом деле пытаетесь сделать? –

+1

Можете ли вы объяснить, как вы получили список «2,3,4,5,8,9 ...»? Вы каким-то образом создали его с помощью списка кортежей? – Kevin

ответ

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! –

+0

Извините, моя ошибка при остановке. Отредактировано новым решением. – Bogdan

3

Her 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, возможно, стоит объяснить «диапазон» и «продлить», поскольку они являются основой решения. –

+0

Я не могу заставить его работать. В нем говорится: TypeError: объект «int» не является итерируемым, для строки: для кортежей в кортежах: –

+0

Thats prbably потому, что вы не даете [(2,5), (8,9), (11,19), (22 , 43), (47,50)] в качестве параметра, но что-то прослежено. скажите, что вы делаете. Будьте более явными и подробными! –

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

Это одна линия работает:

>>> 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)] не имеет значения больше.

+0

Nice golfing;) – filmor

+0

гольф, как дыра в одном? –

0

в вызове converting, вы передаете параметры в обратном порядке.
converting([(2,5),(8,9),(11,19),(22,43),(47,50)], 14)

Смежные вопросы