Kleine Pythonlösungen

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
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

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
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.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
BlackJack

@cofi: Ich denke genau die `merge()`-Funktion die da steht ist gemeint. Warum es die drei Zeilen nicht schon fertig gibt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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).
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

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.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

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

@Gerenuk: Bitte, ein Einzeiler:

Code: Alles auswählen

islice(chain(iterable, repeat(fill_value)), n)
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

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() ;)
Antworten