Seite 1 von 2
Liste mit Zufallszahlen füllen
Verfasst: Mittwoch 18. März 2009, 10:08
von mzh
Hallo zusammen
Ich übergebe an die Funktion die Grösse der Liste, die ich erstellen möchte und die Liste wird daraufhin mit der entsprechenden Anzahl an Zufallszahlen gefüllt.
Code: Alles auswählen
def info(size):
numList = []
for num in range(size):
numList.append(random.randint(1, 10))
return numList
Ginge das auch kompakter oder ist das ungefähr die Art, wie man so etwas in Python machen würde?
Danke für Hinweise.
Verfasst: Mittwoch 18. März 2009, 10:19
von bremer
Wenn's kompakter sein soll:
Code: Alles auswählen
def randoms(size):
return [random.randint(1, 10) for i in size * [None]]
Verfasst: Mittwoch 18. März 2009, 10:20
von helduel
Moin,
Stichwort "List Comprehension":
Code: Alles auswählen
numlist = [random.randint(1, 10) for i in range(size)]
Gruß,
Manuel
Verfasst: Mittwoch 18. März 2009, 10:56
von bremer
Was ist eigentlich schneller? range(10) oder 10 * [None]?
Und wie finde ich das heraus? Wenn ich Timer benutze, nimmt er das nicht.
Verfasst: Mittwoch 18. März 2009, 11:01
von Leonidas
Besser:
Code: Alles auswählen
numlist = [random.randint(1, 10) for i in xrange(size)]
Da man ja die Liste von ``range`` gar nicht braucht.
bremer hat geschrieben:Und wie finde ich das heraus? Wenn ich Timer benutze, nimmt er das nicht.

``timeit``
Verfasst: Mittwoch 18. März 2009, 11:08
von sma
bremer hat geschrieben:Was ist eigentlich schneller? range(10) oder 10 * [None]?
Ist das nicht für 10 Elemente total egal, da der Unterschied im Sub-Millisekundenbereich wäre? Sollte die Frage nicht lauten, was liest sich besser? Und da wäre meine Antwort: Die erste Variante.
Stefan
Verfasst: Mittwoch 18. März 2009, 14:29
von derdon
sma hat geschrieben:Sollte die Frage nicht lauten, was liest sich besser?
Nein, die Frage sollte lauten: "Was brauche ich eigentlich?". In diesem Fall wird kein Counter gebraucht. Es wird eine Funktion aufgerufen, die immer wieder die gleichen Parameter bekommt und das ganze wird in einer Liste gespeichert.
Verfasst: Mittwoch 18. März 2009, 14:42
von audax
Code: Alles auswählen
from itertools import islice
from functional import partial
from random import randint
def repeat_call(func):
while True: yield func()
print list(islice(repeat_call(partial(randint, 1,10)), 10))
Ich mach jetzt ne Runde Haskell. da wäre das nur:
Code: Alles auswählen
gen <- newMTGen Nothing
rand <- randoms gen
print $ take 100000 rand
Verfasst: Mittwoch 18. März 2009, 15:44
von mzh
Ok, und wenn ich jetzt eine Liste von zweier-Tupeln haben will, wobei die Elemente der Tupel selber Zufallszahlen sind?
Code: Alles auswählen
def tupleListNoStringReturner(size):
for i in range(size):
k = random.randint(1, 10)
v = random.randint(1, 10)
return [(k, v) for i in range(size)]
Wie kann man das mit list comprehension machen?
Verfasst: Mittwoch 18. März 2009, 15:53
von derdon
Code: Alles auswählen
In [112]: [tuple(random.sample(xrange(1, 11), 2)) for _ in [None] * 10]
Out[112]:
[(1, 2),
(9, 7),
(2, 9),
(6, 10),
(8, 4),
(3, 5),
(4, 2),
(1, 9),
(1, 5),
(1, 7)]
Verfasst: Mittwoch 18. März 2009, 15:59
von Leonidas
Hier eine Lösung mit zwei Generator Expressions:
Code: Alles auswählen
from random import randint
from itertools import izip
def generate_random_tuples(size):
a = (randint(1, 10) for i in xrange(size))
b = (randint(1, 10) for i in xrange(size))
return izip(a, b)
print list(generate_random_tuples(10))
Verfasst: Mittwoch 18. März 2009, 16:26
von mzh
Danke beide.
Ich versuche noch etwas:
gibt alle types als String aus.
Wie kann ich nun den type als 'type' ausgeben, damit ich zu jedem type den doc-String aufrufen kann?
Verfasst: Mittwoch 18. März 2009, 16:26
von bremer
Mit timeit kann ich Statements "timen". Und wie mache ich das mit meinen Funktionen?
Verfasst: Mittwoch 18. März 2009, 16:51
von Dauerbaustelle
Genauso:
Code: Alles auswählen
timeit.Timer('[(lambda x:x*x)(i) for i in xrange(10)]').timeit()
Oder mit nicht-anonymen Funktionen:
Code: Alles auswählen
def foo(i):
return i*i
timeit.Timer('[foo(i) for i in xrange(10)]', 'from __main__ import foo').timeit()
Verfasst: Mittwoch 18. März 2009, 17:01
von mzh
ich habs:
kaum zu glauben, wie einfach (im Sinne von wenig Aufwand, wenn man weiss wies geht) das ist.
Verfasst: Mittwoch 18. März 2009, 17:08
von DasIch
Code: Alles auswählen
In [82]: def mmap(func, times, seq):
return ([func(item) for _ in xrange(times)] for item in seq)
....:
In [84]: list(mmap(unfold_args(randint), 2, (((1, 10), ) * 10)))
Out[84]:
[[9, 4],
[8, 1],
[8, 7],
[6, 5],
[2, 6],
[5, 10],
[10, 9],
[7, 2],
[1, 4],
[2, 5]]
Was unfold_args macht sollte klar sein.
Verfasst: Mittwoch 18. März 2009, 17:08
von Dauerbaustelle
Nicht ganz, weil du dann ja auch noch das Ganze __*__-Zeugs bekommst. So wäre es besser:
Code: Alles auswählen
[getattr(types, type) for type in dir(types) if '__' not in type]
Verfasst: Mittwoch 18. März 2009, 18:56
von str1442
@ 10 * [None] vs xrange(10): xrange ist eigentlich der am meisten genutze Weg. Im Grunde ist es egal, aber grundsätzlich würde ich keine beliebigen Elemente zum "xmal" iterieren benutzen, sonderen immer {x,}range Objekte, selbst wenn ich die Zahl eigentlich nicht brauche. (und "i" als Variable).
Verfasst: Mittwoch 18. März 2009, 19:47
von numerix
bremer hat geschrieben:Was ist eigentlich schneller? range(10) oder 10 * [None]?
Sollte es hier wirklich auf Performance ankommen - bei n=10 sicher nicht - , dann ist die Erzeugung der Zufallszahlen der Flaschenhals: randint() ist die langsamste Methode, randrange() ist etwas schneller und random() ist erheblich schneller als die beiden anderen Varianten, und zwar selbst dann noch, wenn man ganzzahlige Werte eines bestimmten Intervalls damit erzeugt.
Verfasst: Mittwoch 18. März 2009, 20:36
von snafu
str1442 hat geschrieben:(und "i" als Variable).
Was spricht gegen `dummy`? Gut, das ist jetzt etwas kleinkariert, aber wenn ich die Namen nach ihrer Verwendung vergebe und weiß, dass ich `i` quasi nur als Mittel zum Zweck benötige, macht das ja eigentlich Sinn, find ich.