Seite 1 von 1

Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 12:54
von Gerenuk
Bei einigen Aufgaben habe ich mich gefragt ob Pythonerfahrene was elegantes kennen, was ich vielleicht übersehen habe.

Ich keine "schöne" Lösung für
- Fülle einen iterator mit None auf bis sich X Werte ergeben (z.B. 1,2,3,Stop -> 1,2,3,None,None,None wenn ich auf 6 Werte auffülle) Genaugenommen kam das Problem als ich Counter.most_common gemacht habe und immer 6 Werte haben wollte.

- Außerdem wusste ich nicht wie man mit dem string Bezeichner Locals verändert. Es schien read-only zu sein. Das Konstrukt, dass ich brauchte war in etwa

Code: Alles auswählen

def f(a=None,b=None,c=None):
   for x in ("a", "b", "c"):
      if locals()[x] is None:
         locals()[x]=2
- wieso gibt es kein dictionary merge, was ich oft brauche. Also ein

Code: Alles auswählen

def merge(d1, d2):
    result=dict(d)
    result.update(d2)
    return result

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 13:12
von deets
locals() ist read-only, und dein Anwendungsszenario sieht danach aus, dass es auch besser so ist ;)

Fuer das Iterator-Problem:

Code: Alles auswählen

from itertools import chain, repeat

l = [1, 2, 3]

a, b, c, d, e, f = chain(l, repeat(None, 6 - len(l)))
Oder was verwandtes.

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 13:15
von syntor
Ist dies, wonach du suchst?

Code: Alles auswählen

def fill(iterable, n, dummy=None):
     i = -1
     for i, element in enumerate(iterable):
         yield element
     for _ in range(i + 1, n):
         yield dummy

Code: Alles auswählen

>>> for x in fill(range(5), 6):
...     print x
...     
... 
0
1
2
3
4
None

Beim anderen schliesse ich mich deets an, und denke du solltest einen anderen Ansatz wählen.

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 13:19
von cofi
Gerenuk hat geschrieben:- wieso gibt es kein dictionary merge, was ich oft brauche. Also ein

Code: Alles auswählen

def merge(d1, d2):
    result=dict(d)
    result.update(d2)
    return result
Genau das gibt es doch? Du solltest vllt `result = d1.copy()` nutzen, aber sonst? Was fuer ein Merge schwebt dir denn vor, wo die Eintraege des 2. Dicts die des ersten nicht ueberschreiben?

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 13:23
von BlackJack
@cofi: Ich denke genau die `merge()`-Funktion die da steht ist gemeint. Warum es die drei Zeilen nicht schon fertig gibt.

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 13:32
von cofi
BlackJack hat geschrieben:@cofi: Ich denke genau die `merge()`-Funktion die da steht ist gemeint. Warum es die drei Zeilen nicht schon fertig gibt.
Jetzt wo dus sagst .. Da bin ich sprachlos (zumal bei der inline Variante sogar noch eine Zeile wegfaellt).

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 13:46
von Gerenuk
Danke für die Vorschläge!

Bei dem Merge meinte ich tatsächlich, ob es nicht schon sowas gibt, weil ich es oft brauche und Python ja sonst alles schon vorgefertigt hat :)

Bei dem Auffüllen hatte ich gehofft einen coolen Einzeiler zu finden. Ich hatte auch irgendwas längeres mit 6-len(), aber fand das unintuitiv im Gegensatz zu üblichen Lösungen bei anderen Aufgaben.

Naja, und bei dem Locals Problem fand ich halt der Code wäre pflegbarer wenn ich eine for-loop mache anstatt einem if für jede Variable (in Realfall habe ich da 8). Natürlich könnte man auch keyword arguments nehmen, aber dann schluckt die Funktion zu viel.

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 14:31
von syntor
Du bekommst doch einen Einzeiler sobald du die Funktion selbst definierst?
Das ist doch viel schöner, als jedes Mal einen "coolen Einzeiler" zu benutzen, dessen Interpretation mindestens 10 Mal so lange dauert.

Wäre es denn beim letzten nicht einfacher, den Standardwert auf 2 zu setzen? (Das ist zwar nicht 100%ig das Gleiche)

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 14:37
von lunar
@Gerenuk: Bitte, ein Einzeiler:

Code: Alles auswählen

islice(chain(iterable, repeat(fill_value)), n)

Re: Kleine Pythonlösungen

Verfasst: Mittwoch 13. April 2011, 15:21
von Gerenuk
syntor hat geschrieben:Du bekommst doch einen Einzeiler sobald du die Funktion selbst definierst?
Das ist doch viel schöner, als jedes Mal einen "coolen Einzeiler" zu benutzen, dessen Interpretation mindestens 10 Mal so lange dauert.
Also das Problem irgendwie lösen könnte ich schon, aber ich wollte vorallem mehr über die Funktionen von Python lernen und wie man sie clever kombinieren kann.
syntor hat geschrieben: Wäre es denn beim letzten nicht einfacher, den Standardwert auf 2 zu setzen? (Das ist zwar nicht 100%ig das Gleiche)
Das war ein vereinfachtes Beispiel. Mein spezieller Fall war in etwa "if a is None: a=b[key]"

@syntor:
Cool! Das mit islice war in etwa was ich gesucht hatte.
EDIT: ach nee. sorry. da braucht man ja auch 6-len() ;)