2017-09-12 1 views
0

Ich bin ein Anfänger in Python und fragte mich, warum diese Funktion nicht funktioniert. Es ist syntaktisch korrekt.Python für und While-Schleife für Tupel

Diese Funktion soll jede ungerade Tupel Artikel sammeln und ich eine for-Schleife wie folgt:

def oddTuples(aTup): 

    result =() 

    for i in aTup: 
     if i % 2 == 0: 
      result += (aTup[i],) 

    return result 

Dies ist die ‚richtige‘ Antwort while-Schleife verwenden.

def oddTuples(aTup): 

    # a placeholder to gather our response 
    rTup =() 
    index = 0 

    # Idea: Iterate over the elements in aTup, counting by 2 
    # (every other element) and adding that element to 
    # the result 
    while index < len(aTup): 
     rTup += (aTup[index],) 
     index += 2 

    return rTup 

Wenn mir jemand helfen kann, wäre es sehr geschätzt!

UPDATE

Okay, habe ich das Problem, von 'i' ich bloß wurde innerhalb dieses Tupel den realen Wert zu sammeln. Ich habe festgelegt, dass, aber dieser Code holt nur einige der ungeraden idexed Artikel, nicht alle von ihnen ....

def oddTuples(aTup): 
    result =() 
    for i in aTup: 
     index = aTup.index(i) 
     if index % 2 == 0: 
      result += (aTup[index],) 
    return result 
+2

_ "Es ist syntaktisch korrekt." _ - Nur weil der Parser Ihr Programm akzeptiert, heißt das nicht, dass es funktioniert. Es kann immer noch Probleme in der _logic_ des Programms geben und somit Laufzeitfehler und Bugs verursachen. –

Antwort

0

ich es nicht auf einmal fangen haben, da es war syntaktisch korrekt auch, aber der Fehler, den Sie haben, ist aufgrund der Iteration über die objects des Tupel (aTup) und nicht die Indizes. Siehe hier:

for i in aTup: # <-- For each *object* in the tuple and NOT indices 
    if i % 2 == 0: 
     result += (aTup[i],) 

das Problem zu beheben, verwenden Sie range() und len() über die aTup so dass es über die Indizes des Tupels iteriert statt, und ändern Sie die if Anweisung entsprechend:

for i in range(len(aTup)): 
    if aTup[i] % 2 == 0: 
     result += (aTup[i],) 

Eine Alternative Lösung ist Ihre Aufgabe Iterationen zu halten, aber das Objekt direkt an das result Tupel statt Indizierung anhängen:

for i in aTup: 
    if i % 2 == 0: 
     result += (i,) 

Hope ths half!

0

Ihre for-Schleife wiederholt die Werte in aTup, nicht den Index der Werte.

Es scheint, dass Sie wollen, dass Ihr Code über den Index der Werte oder durch einen Bereich von Zahlen beginnend mit 0 und endend mit der Länge des Tupels minus eins iteriert und dann diese Zahl als Index verwendet, um den Wert herauszuziehen des Tupels.

0

Der Grund ist, dass Sie nicht index..In unter Code bin ich nicht ein Index, sondern das Element in Tupel, aber Sie rufen aTup [i] unter der Annahme, ich ist ein Index, der nicht ist. Der folgende Code funktioniert einwandfrei - Keine Notwendigkeit, aTup [i] oder Bereich zu machen.

def oddTuples(aTup): 
    result =() 
    for i in aTup: 
     if i % 2 == 0: 
      result += (i,) 
    return result 
0

In einfachen Worten, wenn Ihr Tupel

tup = (1, 2, 3, 4, 5 , 1000); 

ist, wenn Ihr Code, wenn Überprüfung wird jeder Artikel ist% 2 == 0 oder nicht was nicht ist, was Sie wollen, aus Ihrer Beschreibung Sie möchten nur die Elemente mit ungeraden Index

wenn Sie also das Tupel oben versuchen, erhalten Sie folgende Fehlermeldung erhalten: IndexError: tuple index out of range, denn für die 1000 es s atisfy Ihre Bedingung und wird tun, was in der if gesagt wird, versuchen, die aTup (1000) (Element des Index 1000 in Ihrem Eingabe-Tupel) die nicht existiert, da das Tupel nur aus 6 Elementen zu Ihrem Ergebnis ist Tuple

Dazu for-Schleife zu arbeiten, können Sie die folgende Methode

verwenden können
def oddTuples(aTup): 
    result =() 
for i in aTup: 
    index = tup.index(i) # getting the index of each element 
    if index % 2 == 0: 
     result += (aTup[index],) 
     print(aTup[index]) 
return result 
# Testing the function with a tuple 
if __name__ == "__main__": 
    tup = (1, 2, 3, 7, 5, 1000, 1022) 
    tup_res = oddTuples(tup) 
    print(tup_res) 

Das Ergebnis dieser ersetzt wird

1 
3 
5 
1022 
(1, 3, 5, 1022) 

Process finished with exit code 0 
+0

Danke für die Antwort, aufgrund der Einrückung der Code lief nicht richtig, aber ich verstand, was Sie versucht haben zu sagen! Aber es läuft immer noch nicht perfekt .. – hellocsk

+0

@hellocsk herzlich willkommen, tatsächlich lief es richtig, nur überprüfen Sie die Einrückung langsam und Sie können es beheben Ich bin sicher :), ich bin glücklich, dass meine Antwort für Sie klar war, bitte abstimmen wenn Sie meine Antwort hilfreich finden (das würde mir wirklich helfen), vielen Dank –

0

Versuchen

Mit

def oddTuples(aTup): 
    result =() 
    for i in aTup: 
     index = aTup.index(i) 
     result += (aTup[index],) 
    return result 

Um Ihnen Problem zu beheben davon nur die geraden nummerierten tun.