Liste mit Zufallszahlen füllen

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.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Liste mit Zufallszahlen füllen

Beitragvon mzh » Mittwoch 18. März 2009, 10:08

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.
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Beitragvon bremer » Mittwoch 18. März 2009, 10:19

Wenn's kompakter sein soll:

Code: Alles auswählen

def randoms(size):
    return [random.randint(1, 10) for i in size * [None]]
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Beitragvon helduel » Mittwoch 18. März 2009, 10:20

Moin,

Stichwort "List Comprehension":

Code: Alles auswählen

numlist = [random.randint(1, 10) for i in range(size)]


Gruß,
Manuel
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Beitragvon bremer » Mittwoch 18. März 2009, 10:56

Was ist eigentlich schneller? range(10) oder 10 * [None]?

Und wie finde ich das heraus? Wenn ich Timer benutze, nimmt er das nicht.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 18. März 2009, 11:01

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``
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Mittwoch 18. März 2009, 11:08

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Mittwoch 18. März 2009, 14:29

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Mittwoch 18. März 2009, 14:42

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Beitragvon mzh » Mittwoch 18. März 2009, 15:44

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?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Mittwoch 18. März 2009, 15:53

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)]
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 18. März 2009, 15:59

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))
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Beitragvon mzh » Mittwoch 18. März 2009, 16:26

Danke beide.
Ich versuche noch etwas:

Code: Alles auswählen

import types

for i in dir(types):
    print(i)


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?
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Beitragvon bremer » Mittwoch 18. März 2009, 16:26

Mit timeit kann ich Statements "timen". Und wie mache ich das mit meinen Funktionen?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Beitragvon Dauerbaustelle » Mittwoch 18. März 2009, 16:51

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()
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Beitragvon mzh » Mittwoch 18. März 2009, 17:01

ich habs:

Code: Alles auswählen

for i in dir(types):
    print(getattr(types, i).__doc__)



kaum zu glauben, wie einfach (im Sinne von wenig Aufwand, wenn man weiss wies geht) das ist.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]