Seite 1 von 1

Positionsindex eines Tupels in eine Liste

Verfasst: Donnerstag 29. Juli 2021, 16:37
von Coderjo
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.

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Donnerstag 29. Juli 2021, 16:54
von __deets__
Dann Return doch (x, y)

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Donnerstag 29. Juli 2021, 16:57
von Coderjo
__deets__ hat geschrieben: Donnerstag 29. Juli 2021, 16:54 Dann Return doch (x, y)
Ja, hilft nicht weiter, da ich den Index brauche.

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Donnerstag 29. Juli 2021, 18:29
von __deets__
Verstehe ich nicht. Was willst du denn dann? Was ist Zahl für dein ds, und was soll dann bestimmt werden?

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Donnerstag 29. Juli 2021, 18:45
von ThomasL

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]

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Donnerstag 29. Juli 2021, 19:35
von Sirius3
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.

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Freitag 30. Juli 2021, 01:22
von Coderjo
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.

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Freitag 30. Juli 2021, 01:24
von Coderjo
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.

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Freitag 30. Juli 2021, 01:45
von LukeNukem
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 ;-)

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Freitag 30. Juli 2021, 10:09
von DeaD_EyE
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

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Freitag 30. Juli 2021, 10:43
von Sirius3
@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.

Re: Positionsindex eines Tupels in eine Liste

Verfasst: Freitag 30. Juli 2021, 12:56
von DeaD_EyE
@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.