Seite 1 von 2

Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 10:18
von mutetella
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

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 10:25
von snafu
Ja:

Code: Alles auswählen

a[1::2]
Das bedeutet: Gehe von Index 1 bis zum Ende (weil ausgelassen) in 2er-Schritten.

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 10:30
von mutetella
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

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 10:44
von snafu
Wenn dir das denn nicht zu indirekt ist:

Code: Alles auswählen

[a[1], a[3]]
Anders geht's AFAIK nicht.

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 11:00
von .robert

Code: Alles auswählen

[a[i] for i in [7,8,12,21]]
:wink:

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 19:08
von mutetella
Danke für Eure Antworten. Allerdings muss ich dann doch ein wenig ausholen... :wink:

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']
Wenn ich der Funktion nun mit

Code: Alles auswählen

[test()[1], test()[3]]
die Werte 2 und 4 entlocke, erhalte ich

Code: Alles auswählen

mache irgendwas...
mache irgendwas...
['Wert 2', 'Wert 4']
test() wird (natürlich!) 2 x durchlaufen. Wenn ich snafu's Tipp

Code: Alles auswählen

test()[1::2]
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

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 19:15
von Hyperion
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.
Du musst doch nur den Rückgabewert an einen Namen binden!

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 19:15
von /me
mutetella hat geschrieben:

Code: Alles auswählen

[test()[1], test()[3]]
Du möchtest die Aufrufe von test() reduzieren. Das schreit doch nach

Code: Alles auswählen

result = test()
return [result[1], result[3]]

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 19:21
von noisefloor
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

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Montag 14. Juni 2010, 21:49
von snafu

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

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Dienstag 15. Juni 2010, 07:25
von mutetella
@snafu:
Das ist cool. Für heute bist Du mein Held!!! :-)

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Dienstag 15. Juni 2010, 08:43
von Hyperion
mutetella hat geschrieben:@snafu:
Das ist cool. Für heute bist Du mein Held!!! :-)
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 hindert ;-)

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Dienstag 15. Juni 2010, 08:50
von snafu
Vielleicht ist die Funktion ja aus einer fremden Bibliothek und er will sie nicht verändern. Grundsätzlich auf die Überlegung eingehen könnte er aber wirklich mal.

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Dienstag 15. Juni 2010, 16:13
von mutetella
Sorry, war noch mit einer anderen Baustelle beschäftigt...
noisefloor hat geschrieben:geht es nicht, dass du in Test() schon selektierst, was du zurückgibst?
Doch, das ist natürlich möglich... Um das ganze noch ein wenig zu konkretisieren:
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')
würde sogar weniger Berechnungsarbeit verursachen als das, was ich ursprünglich wollte, wenn firstday() eine Liste mit allen 3 Möglichkeiten zurückgibt

Code: Alles auswählen

first_day_week, first_day_year = firstday()[0], firstday()[2]
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

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Dienstag 15. Juni 2010, 17:13
von BlackJack
@mutetella: Das sieht für mich eher danach aus, als wenn das drei Funktionen werden sollten.

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Mittwoch 16. Juni 2010, 08:21
von mutetella
BlackJack hat geschrieben: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?

Gruß
mutetella

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Mittwoch 16. Juni 2010, 08:42
von BlackJack
@mutetella: Dem Grundsatz, das *eine* Funktion *eine* Aufgabe erledigen sollte.

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Mittwoch 16. Juni 2010, 09:44
von snafu
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).

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Mittwoch 16. Juni 2010, 10:10
von mutetella
snafu hat geschrieben:"Sinnvoll" meint zum Einen das Vermeiden von DRY...
Was meinst Du damit? Vielleicht try: ... except: Abfragen?

Re: Elemente aus Liste 'herauspicken'...?

Verfasst: Mittwoch 16. Juni 2010, 10:16
von snafu