Elemente aus Liste 'herauspicken'...?
Hallo,
habe in der python.doc keine Lösung gefunden, was nicht heißt, dass ich Sie hätte finden können:
Ich habe eine Liste a = ['a', 'b', 'c', 'd']. a[0:2] z. B. gibt mir ['a', 'b'] zurück. Gibt es eine Möglichkeit, nur z. B. 'b' und die 'd' in Form von ['b', 'd'] zu erhalten, sowas wie a[1,3] oder a[1 and 3]...?
Wenn nicht, mach' ich halt ein dict.
Gruß
mutetella
habe in der python.doc keine Lösung gefunden, was nicht heißt, dass ich Sie hätte finden können:
Ich habe eine Liste a = ['a', 'b', 'c', 'd']. a[0:2] z. B. gibt mir ['a', 'b'] zurück. Gibt es eine Möglichkeit, nur z. B. 'b' und die 'd' in Form von ['b', 'd'] zu erhalten, sowas wie a[1,3] oder a[1 and 3]...?
Wenn nicht, mach' ich halt ein dict.
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Ja:
Das bedeutet: Gehe von Index 1 bis zum Ende (weil ausgelassen) in 2er-Schritten.
Code: Alles auswählen
a[1::2]
Ok, das ist klasse, das kann ich so verwenden... Vielen Dank!
Noch interessehalber: Ein direkter Zugriff auf 2 (oder mehr) nicht definierbar aufeinanderfolgende Elemente ist nicht möglich, oder? Also sowas wie liste[0, 7] für das 1. und 8. Element einer Liste...?
mutetella
Noch interessehalber: Ein direkter Zugriff auf 2 (oder mehr) nicht definierbar aufeinanderfolgende Elemente ist nicht möglich, oder? Also sowas wie liste[0, 7] für das 1. und 8. Element einer Liste...?
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Wenn dir das denn nicht zu indirekt ist:
Anders geht's AFAIK nicht.
Code: Alles auswählen
[a[1], a[3]]
Code: Alles auswählen
[a[i] for i in [7,8,12,21]]

Danke für Eure Antworten. Allerdings muss ich dann doch ein wenig ausholen...
Ich habe eine Funktion, die mir verschiedene Werte in Form einer Liste zur Verfügung stellt, auf die ich dann nach Bedarf zugreife. Die Funktion sieht im übertragenen Sinne folgendermaßen aus:
Wenn ich der Funktion nun mit
die Werte 2 und 4 entlocke, erhalte ich
test() wird (natürlich!) 2 x durchlaufen. Wenn ich snafu's Tipp
verwende, erhalte ich ebenfalls eine Liste mit Wert 2 und Wert 4, dabei wird test() nur 1 x durchlaufen.
Mich würde nun eine Möglichkeit interessieren, auf Wert 2 und Wert 4 oder irgendwelche anderen Werte direkt zuzugreifen, ohne dass test() mehrmals durchlaufen wird.
.robert's Idee wäre da 'ne klasse Sache, allerdings muss auch dabei pro Wert test() durchlaufen werden.
Oder hab' ich mich jetzt wieder mal in so eine idiotische Idee gebohrt, die nur eines ist: Idiotisch und überhaupt nicht zielführend...
Gruß
mutetella

Ich habe eine Funktion, die mir verschiedene Werte in Form einer Liste zur Verfügung stellt, auf die ich dann nach Bedarf zugreife. Die Funktion sieht im übertragenen Sinne folgendermaßen aus:
Code: Alles auswählen
def test():
print('mache irgendwas...')
return ['Wert 1', 'Wert 2', 'Wert 3', 'Wert 4']
Code: Alles auswählen
[test()[1], test()[3]]
Code: Alles auswählen
mache irgendwas...
mache irgendwas...
['Wert 2', 'Wert 4']
Code: Alles auswählen
test()[1::2]
Mich würde nun eine Möglichkeit interessieren, auf Wert 2 und Wert 4 oder irgendwelche anderen Werte direkt zuzugreifen, ohne dass test() mehrmals durchlaufen wird.
.robert's Idee wäre da 'ne klasse Sache, allerdings muss auch dabei pro Wert test() durchlaufen werden.
Oder hab' ich mich jetzt wieder mal in so eine idiotische Idee gebohrt, die nur eines ist: Idiotisch und überhaupt nicht zielführend...

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Du musst doch nur den Rückgabewert an einen Namen binden!mutetella hat geschrieben: Mich würde nun eine Möglichkeit interessieren, auf Wert 2 und Wert 4 oder irgendwelche anderen Werte direkt zuzugreifen, ohne dass test() mehrmals durchlaufen wird.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Du möchtest die Aufrufe von test() reduzieren. Das schreit doch nachmutetella hat geschrieben:Code: Alles auswählen
[test()[1], test()[3]]
Code: Alles auswählen
result = test()
return [result[1], result[3]]
- noisefloor
- User
- Beiträge: 4209
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
geht es nicht, dass du in Test() schon selektierst, was du zurückgibst? Im Moment gibt's du ja alles zurück und selektierst dann...
Gruß, noisefloor
geht es nicht, dass du in Test() schon selektierst, was du zurückgibst? Im Moment gibt's du ja alles zurück und selektierst dann...
Gruß, noisefloor
Code: Alles auswählen
>>> from operator import itemgetter
>>> get_elems = itemgetter(1,2,4)
>>> def test():
... return ['a', 'b', 'c', 'd', 'e', 'f', 'g']
...
>>> get_elems(test())
('b', 'c', 'e')
@snafu:
Das ist cool. Für heute bist Du mein Held!!!
Das ist cool. Für heute bist Du mein Held!!!

Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Nichts gegen snafus Lösung, aber wäre es nicht wirklich geschickter die Filterung in der Funktion durchzuführen und nur das zurückzugeben, was Du auch brauchst? noisefloor hatte das ja schon angeregt und Du uns bisher nicht verraten, was Dich daran hindertmutetella hat geschrieben:@snafu:
Das ist cool. Für heute bist Du mein Held!!!

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Sorry, war noch mit einer anderen Baustelle beschäftigt...
Die Funktion hat die Aufgabe,
- den ersten Tag der aktuellen Woche, abhängig des voreingestellten ersten Wochentags,
- den ersten Tag des aktuellen Monats und
- den ersten Tag des Jahres
zurückzugeben. Ohne es besser zu wissen fühlt es sich für mich nicht gut an, wenn sich die Funktion, die sich um die Datumsberechnung kümmert auch darum kümmern soll, welches konkrete Datum denn die aufrufende Methode benötigt. Andererseits könnte ich der Funktion auch einfach mitteilen, welches Datum ich möchte und dann auch nur dieses zurückerhalten. Somit würde auch jeweils nur das berechnet, was angefragt wird und ein Aufruf wie
würde sogar weniger Berechnungsarbeit verursachen als das, was ich ursprünglich wollte, wenn firstday() eine Liste mit allen 3 Möglichkeiten zurückgibt
Mir fehlt einfach noch so viel an Erfahrung, deshalb bleibt mir oft nix anderes übrig, als mich auf mein Gefühl zu verlassen. Und die Dinge so strikt als möglich zu trennen fühlt sich meistens richtig an. Aber wie so oft muss man halt auch aufpassen, die Kurve noch zu kriegen...
Aber snafu's itemgetter find' ich trotzdem voll cool. Basta!
Gruß
mutetella
Doch, das ist natürlich möglich... Um das ganze noch ein wenig zu konkretisieren:noisefloor hat geschrieben:geht es nicht, dass du in Test() schon selektierst, was du zurückgibst?
Die Funktion hat die Aufgabe,
- den ersten Tag der aktuellen Woche, abhängig des voreingestellten ersten Wochentags,
- den ersten Tag des aktuellen Monats und
- den ersten Tag des Jahres
zurückzugeben. Ohne es besser zu wissen fühlt es sich für mich nicht gut an, wenn sich die Funktion, die sich um die Datumsberechnung kümmert auch darum kümmern soll, welches konkrete Datum denn die aufrufende Methode benötigt. Andererseits könnte ich der Funktion auch einfach mitteilen, welches Datum ich möchte und dann auch nur dieses zurückerhalten. Somit würde auch jeweils nur das berechnet, was angefragt wird und ein Aufruf wie
Code: Alles auswählen
first_day_week, first_day_year = firstday('week'), firstday('year')
Code: Alles auswählen
first_day_week, first_day_year = firstday()[0], firstday()[2]

Aber snafu's itemgetter find' ich trotzdem voll cool. Basta!

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

@mutetella: Das sieht für mich eher danach aus, als wenn das drei Funktionen werden sollten.
Du meinst, für jeden der 3 Rückgabewerte eine separate Funktion? Welchem Grundsatz würde das Rechnung tragen?BlackJack hat geschrieben:Das sieht für mich eher danach aus, als wenn das drei Funktionen werden sollten.
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Sehe ich ganz ähnlich wie BJ. In einem guten Design werden große Prozesse sozusagen sukzessive in sinnvolle Kleinstaufgaben unterteilt. Die kleinste Einteilung ist hier die Funktion bzw Methode. "Sinnvoll" meint zum Einen das Vermeiden von DRY, aber zum Anderen (das spielt schon in Punkt 1 mit rein) auch die Wiederverwendbarkeit (selbst wenn man es in dem Moment noch nicht braucht). Man findet in-the-wild genügend Beispiele, wo Funktionen oft nur über 2 oder 3 Zeilen gehen. Das ist aber absolut nicht schlimm, solange es Sinn macht. Wenn man sich Python anguckt, dann sieht man ja, dass da auch etliche Funktionen zur Erledigung von Kleinstaufgaben im Angebot sind, die baukastenmäßig zu größeren Einheiten zusammengesetzt werden (können).
Was meinst Du damit? Vielleicht try: ... except: Abfragen?snafu hat geschrieben:"Sinnvoll" meint zum Einen das Vermeiden von DRY...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Ich meine: http://de.wikipedia.org/wiki/DRY