Positionsindex eines Tupels in eine Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Coderjo
User
Beiträge: 13
Registriert: Donnerstag 27. Mai 2021, 14:38

Hallo Forum-Nutzer,
Kann mir jemand helfen, wie man die Position eines Tupels in einer liste bestimmt nach der enthaltenen Zahl?

Beispiel:
ds= [(1,2),(3,1),(5,3),(5,1),(4,1)]

Ich würde die Funktion Zahlenthalten(liste, zahl ), würde ich folgendermaßen definieren:
def Zahlenthalten(liste, zahl ):
for (x,y) in list:
if y == zahl:
t= (x,y)
return xs.index(t)

Jedoch bekomme ich dann nur den Index des y ausgegeben.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann Return doch (x, y)
Coderjo
User
Beiträge: 13
Registriert: Donnerstag 27. Mai 2021, 14:38

__deets__ hat geschrieben: Donnerstag 29. Juli 2021, 16:54 Dann Return doch (x, y)
Ja, hilft nicht weiter, da ich den Index brauche.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Verstehe ich nicht. Was willst du denn dann? Was ist Zahl für dein ds, und was soll dann bestimmt werden?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Code: Alles auswählen

ds = [(1,2),(3,1),(5,3),(5,1),(4,1)]

def zahl_enthalten(liste, zahl):
    return [index for index, (x,y) in enumerate(liste) if x == zahl or y == zahl]

print(zahl_enthalten(ds, 1))

>>> [0, 1, 3, 4]
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist denn „thalten” für ein Verb? Zusammengesetzte Funktionsnamen trennt man per _.
`xs` ist nicht definiert.
Wenn die Zahl nicht gefunden wird, ist `t` nicht definiert, und es gibt einen UnboundLocalError.
Eigentlich würde man einen ValueError erwarten.

Code: Alles auswählen

def zahl_enthalten(liste, zahl):
    found_index = None
    for index, (x, y) in enumerate(list):
        if y == zahl:
            found_index = index
    if found_index is None:
        raise ValueError()
    return found_index
Bei einer Funktion, die `zahl_enthalten` heißt, würde man aber einen Wahrheitswert als Rückgabewert erwarten.

Und ich verstehe wie __deets__ nicht, was Du eigentlich willst. Du bekommst doch einen Index.
Coderjo
User
Beiträge: 13
Registriert: Donnerstag 27. Mai 2021, 14:38

Sirius3 hat geschrieben: Donnerstag 29. Juli 2021, 19:35 Was ist denn „thalten” für ein Verb? Zusammengesetzte Funktionsnamen trennt man per _.
`xs` ist nicht definiert.
Wenn die Zahl nicht gefunden wird, ist `t` nicht definiert, und es gibt einen UnboundLocalError.
Eigentlich würde man einen ValueError erwarten.

Code: Alles auswählen

def zahl_enthalten(liste, zahl):
    found_index = None
    for index, (x, y) in enumerate(list):
        if y == zahl:
            found_index = index
    if found_index is None:
        raise ValueError()
    return found_index
Bei einer Funktion, die `zahl_enthalten` heißt, würde man aber einen Wahrheitswert als Rückgabewert erwarten.

Und ich verstehe wie __deets__ nicht, was Du eigentlich willst. Du bekommst doch einen Index.
Danke für deine Antwort. anstatt xs, sollte eigentlich 'liste' hinkommen, habe ich aus Versehen falsch geschrieben. Den Code hatte ich jedoch richtig, also ohne Fehler geschrieben, nur hier beim Abtippen Fehler gemacht. Das Problem, was ich hatte war, dass ich nicht den Index des gesamten Tupels in der Liste ausgegeben bekam, sondern lediglich den Positionsindex des Elements, welches hier das 'y' wäre.
Coderjo
User
Beiträge: 13
Registriert: Donnerstag 27. Mai 2021, 14:38

ThomasL hat geschrieben: Donnerstag 29. Juli 2021, 18:45

Code: Alles auswählen

ds = [(1,2),(3,1),(5,3),(5,1),(4,1)]

def zahl_enthalten(liste, zahl):
    return [index for index, (x,y) in enumerate(liste) if x == zahl or y == zahl]

print(zahl_enthalten(ds, 1))

>>> [0, 1, 3, 4]
Vielen Dank für die hilfreiche Antwort.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

ThomasL hat geschrieben: Donnerstag 29. Juli 2021, 18:45

Code: Alles auswählen

def zahl_enthalten(liste, zahl):
    return [index for index, (x,y) in enumerate(liste) if x == zahl or y == zahl]

Code: Alles auswählen

def zahl_enthalten(liste, zahl):
    return [index for index, (x,y) in enumerate(liste) if zahl in(x, y)]
... and you might even return a generator... ;-)

https://www.youtube.com/watch?v=NG2ci9CyiwI ;-)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Was ist eigentlich, wenn eine Tuple mehr als einmal vorkommt?

Code: Alles auswählen

def get_idx(sequence, value, index=0):
    try:
        return sequence.index(value, index)
    except ValueError:
        return -1


def get_all_idx(sequence, value):
    indexes = []
    pos = 0
    
    while True:
        index = get_idx(sequence, value, index=pos)
        if index == -1:
            break
            
        pos = index + 1
        indexes.append(index)
    
    return indexes
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@LukeNukem:

Code: Alles auswählen

def zahl_enthalten(liste, zahl):
    return [index for index, zahlen in enumerate(liste) if zahl in zahlen]
@DeaD_EyE: der OP hat nicht genau spezifiziert, welcher Index gewollt ist. Ich hatte spontan anhand des Codes angenommen, dass der Index des letzten Vorkommens der Zahl gewollt ist. Wenn man die minimale Änderung am Code vornimmt, so dass er funktioniert, wäre es aber der erste Index des Tuples, das die selben x/y-Werte hat, wie das letzte Tuple bei dem der y-Wert einen bestimmten Wert hat.
Da wir die Anwendung nicht kennen, könnte das ja gefordert sein.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

@Sirius3
Wenn er nur das letzte vorkommende Element von Rechts haben möchte, kann er den für die Position -1 verwenden.

Code: Alles auswählen

ds = ("AB", "A", "A", "AB")

pos_1 = ds.index("AB")
pos_2 = ds.index("AB", -1)

print(pos_1, pos_2)

Die List-Comprehension mit der Enumeration finde ich sogar besser, da dadurch der try...except-block entfällt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten