/ / Summe von Elementen aus verschiedenen Tupeln - Python, Tupel

Summe von Elementen aus verschiedenen Tupeln - Python, Tupel

Ich muss eine Funktion erstellen, die eine Liste von Tupeln und eine Zahl aufnehmen kann. Beispiel: wenn die Liste der Tupel ist [(2,5),(8,9),(11,19),(22,43),(47,50)], und die Zahl ist 14, sollte es 18 zurückgeben. Der Grund dafür ist Nummer 13 in der Liste 2,3,4,5,8,9,11,12,13,14,15,16,17,18,19... ist 18, wenn alle Zahlen enthalten sind:

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

Ich habe jetzt:

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)])

Wenn ich das drucke, bekomme ich die Nachricht: für Tupel in Tupeln: TypeError: Das Objekt "int" ist nicht iterierbar

Antworten:

0 für die Antwort № 1

Wenn ich das Problem richtig verstehe, hast du einReihenfolge der Intervalle und Sie müssen die n-te Zahl aus diesen Intervallen extrahieren. Hier ist eine andere Lösung bezüglich des verwendeten Algorithmus. Zählen Sie einfach alle fehlenden Zahlen aus Ihrer Intervallsequenz und fügen Sie sie Ihrem Wert hinzu:

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))

3 für die Antwort № 2

Hier ist etwas, mit dem Sie beginnen können. Es kann präziser gemacht werden, aber ich habe versucht, es so klar wie möglich zu machen. Sie sollten auch überlegen, was Sie tun möchten, wenn die angegebenen Tupel nicht in der richtigen Reihenfolge sind oder wenn der Index in der Werteliste nicht verfügbar ist.

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]

2 für die Antwort № 3

Diese Ein-Zeilen-Funktion:

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

Tupel bestellen in [(47,50),(22,43),(8,9),(2,5),(11,19)] es ist nun auch egal.


0 für die Antwort № 4

Sie können den folgenden One-Liner verwenden:

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

woher t ist die Liste der Tupel in Ihrer Frage.

Die Lösung ist im Grunde:

  • Generiere für jedes Tupel eine Liste der Elemente, mit denen sie verbunden sind range
  • Reduzieren Sie das Ergebnis (Liste der Listen) auf eine Liste
  • Holen Sie sich das Element, nach dem Sie suchen

Für mehr Spaß wäre eine faule Lösung:

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

0 für die Antwort № 5

In deinem Anruf zu convertingübergeben Sie die Parameter in umgekehrter Reihenfolge.
Du solltest anrufen converting([(2,5),(8,9),(11,19),(22,43),(47,50)], 14)