Seite 1 von 1

funktionswerte festlegen

Verfasst: Dienstag 12. Mai 2009, 11:08
von 4bit
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.

Verfasst: Dienstag 12. Mai 2009, 11:43
von derdon

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

Verfasst: Dienstag 12. Mai 2009, 12:09
von bwbg
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

Verfasst: Dienstag 12. Mai 2009, 12:24
von 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.

Verfasst: Dienstag 12. Mai 2009, 12:33
von 4bit
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"]

Verfasst: Dienstag 12. Mai 2009, 12:49
von EyDu
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']
>>>

Verfasst: Dienstag 12. Mai 2009, 13:07
von 4bit
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.

Verfasst: Dienstag 12. Mai 2009, 13:21
von EyDu
"itertools.product" gibt es auch erst ab 2.6. Zu den maxwert Schleifen: das löst du am besten rekursiv.

Verfasst: Dienstag 12. Mai 2009, 13:32
von 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.

Verfasst: Dienstag 12. Mai 2009, 13:34
von derdon
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

Verfasst: Dienstag 12. Mai 2009, 14:11
von 4bit
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.

Verfasst: Dienstag 12. Mai 2009, 15:18
von 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.

Verfasst: Dienstag 12. Mai 2009, 15:33
von numerix
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.