funktionswerte festlegen

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
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

Hallo,

ich schreibe gerade eine Funktion Obermenge(variablen, maxWert) die iterativ eine Liste mit Ziffern-Strings erstellen soll. variablen gibt die Länge der Strings an und maxWert<=9 den Maximalwert für jede Ziffer. Ansonsten soll die Liste vollständig sein.
Da die Funktion iterativ ist, muss ich den Startwert festlegen:

Code: Alles auswählen

if variablen == 1:
    ret = []
    for i in range(maxWert):
        ret.append(str(i))
    return ret
else:
    ...
Würdet ihr das auch mit einer if...else... Klammer machen?
Vermutlich gibt es einen besseren Weg, da die Funktion vielleicht etwas unübersichtlich wird wenn es mehrere solcher Ausnahmen gibt.

Grüße,
4bit.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

In [832]: def main_set(max_value, *args):
        return [str(index) for index, item in enumerate(args) if index < max_value]
   .....: 

In [834]: main_set(5, 'la', 'le', 'lu')
Out[834]: ['0', '1', '2']
So?

Edit: Hier in schöner

Code: Alles auswählen

In [885]: import sys

In [886]: def main_set(sequence, max_value=sys.maxint):    
        return [str(index) for index, item in enumerate(sequence) if index < max_value]
   .....: 

In [888]: main_set(('la', 'le', 'lu'))
Out[888]: ['0', '1', '2']

In [889]: main_set(('la', 'le', 'lu'), 2)
Out[889]: ['0', '1']
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Geht es nur mir so, oder versteht ein anderer die Frage auch nicht?
variablen gibt die Länge der Strings an
Nehme ich das wörtlich, so müssten Zeichenketten a la " 1", " 3" etc. generiert werden.

Desweiteren scheinen zwei Integer als Argumente gefordert.

:?

Im einfachsten Fall könnte sowas wie

Code: Alles auswählen

obermenge = lambda a, b: [str(i) for i in xrange(a, b+1)]
greifen.

Grüße...

Heiko
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@4bit: Also das was Du da zeigst lässt sich wesentlich kürzer so schreiben:

Code: Alles auswählen

if variables == 1:
    return map(str, range(max_value))
else:
    # ...
Aber was passiert denn im ``else``-Teil bzw. warum wird ``variables == 1`` besonders behandelt?

Wie sollte denn das Ergebnis von ``superset(2, 3)`` aussehen? Vielleicht so: ``['00', '01', '02', '10', '11', '12', '20', '21', '22']``? Dann würde ich mit einem Zähler und einer Schleife und Modulo arbeiten.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

Was die Funktion genau macht ist eigentlich nicht so wichtig, obwohl ich mich natrülich freuen würde, wenn jemand eine kürzere Lösung findet.
Es ging mir eigentlich darum, wie ihr Funktionswerte für bestimmte Parameter festlegt, wohingegen alle anderen Parameter anders berechnet werden.

Trotzdem hier ein Beispiel dafür, was obermenge macht:

Code: Alles auswählen

>>>obermenge(2,3) # zwei Ziffern, maxwert pro Ziffer ist 3
["00","01","02","03","10","11","12","13","20","21","22","23","30","31","32","33"]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

So?

Code: Alles auswählen

>>> import itertools
>>> def obermenge(repeat, max_value):
...     return ["%d"*repeat % x for x in itertools.product(range(max_value+1), repeat=repeat)]
...
>>> obermenge(2, 3)
['00', '01', '02', '03', '10', '11', '12', '13', '20', '21', '22', '23', '30', '31', '32', '33']
>>>
Das Leben ist wie ein Tennisball.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

ja, danke ejdu.

dachte gerade, daß man etwas in der art mit range und for i in machen könnte:

Code: Alles auswählen

s = range(variable)
t = range(maxwert)

for i in s:
    for j in t:
        print i+j
aber das Problem ist, daß man maxwert for-Schleifen bräuchte. Leider verstehe ich nicht wie deine Lösung funktioniert.
Ich schau mal nach, was ich zu itertools.product finden kann.

Meine installation von itertools kennt product garnicht:
CLASSES
__builtin__.object
chain
count
cycle
dropwhile
groupby
ifilter
ifilterfalse
imap
islice
izip
repeat
starmap
takewhile
4bit.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

"itertools.product" gibt es auch erst ab 2.6. Zu den maxwert Schleifen: das löst du am besten rekursiv.
Das Leben ist wie ein Tennisball.
BlackJack

Da das letztendlich nur die Darstellung einer Zahl zur Basis `maxWert + 1` ist, lässt sich das auch ganz einfach iterativ lösen, indem man eben eine Funktion schreibt, die eine Zahl `i` zur Basis `maxWert + 1` und mit Länge `variablen` als Zeichenkette formatiert. Und schon kann man alle möglichen Werte mit der Länge auflisten und in eine Liste stecken.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Hier kannst du den äquivalenten Python-Code für itertools.product finden (wenn du diese Funktion in deinem Programm definierst, brauchst du kein Python2.6): http://docs.python.org/library/itertool ... ls.product
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

Gibt es nicht schon eine Python eigene Funktion, die Zahlen in andere Systeme umrechnet? So ähnlich wie int("010101", 2).
Finde diese Idee am einfachsten.

Grüße.
4bit.
BlackJack

Gibt's nicht, aber das Thema Zahlen in verschiedenen Basen darstellen ist eine sehr beliebte Hausaufgabe. Das hatten wir hier im Forum schon etliche Male.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:Gibt's nicht, aber das Thema Zahlen in verschiedenen Basen darstellen ist eine sehr beliebte Hausaufgabe.
Und wer Spaß daran hat, aber keine Hausaufgaben aufbekommen, der kann sich bei SPOJ an der (nicht schwierigen) Aufgabe BASE versuchen.
Antworten