2010-10-30 9 views
116

Ich versuche ein Histogramm von counts zu erstellen ... also erstelle ich Buckets. Ich weiß, dass ich nur durch gehen und eine Reihe von Nullen anhängen das heißt etwas in dieser Richtung:Wie man ein Array von Nullen in Python deklariert (oder ein Array mit einer bestimmten Größe)

buckets = [] 
for i in xrange(0,100): 
    buckets.append(0) 

Gibt es eine elegantere Möglichkeit, es zu tun? Ich denke, es sollte eine Möglichkeit geben, ein Array bestimmter Größe zu deklarieren.

Ich weiß numpy hat numpy.zeros aber ich möchte die allgemeinere Lösung

+2

Pythons Listen sind Listen, keine Arrays. Und in Python deklariert man nicht Dinge wie in C: man definiert Funktionen und Klassen (über def- und class-Anweisungen) und weist Variablen zu, die, wenn sie noch nicht existieren, bei der ersten Zuweisung magisch erzeugt werden. Außerdem sind Variablen (und Listen) keine Speicherbereiche, die Objekte enthalten, aber Namen, die sich auf Objekte beziehen. Ein Objekt kann in nur einem Speicherbereich enthalten sein, kann aber durch mehrere Namen referenziert werden. – pillmuncher

+1

Python hat keine "Deklarationen", insbesondere von Containern mit einer Größe aber nicht spezifizierten Inhalten. Du willst etwas, du schreibst einen Ausdruck. –

+3

... und die Semikolons sind völlig unnötig – bstpierre

Antwort

250
buckets = [0] * 100 
+18

Vorsicht - [diese Technik verallgemeinert nicht zu mehrdimensionalen Arrays oder Listen von Listen] (https://docs.python.org/2/faq/programming.html#how-do -i-create-a-multidimensional-Liste). – rphv

15

Sie n eine list durch eine ganze Zahl multiplizieren können die listn mal zu wiederholen:

buckets = [0] * 100 
3

Die einfachste Lösung wäre be

"\x00" * size # for a buffer of binary zeros 
[0] * size # for a list of integer zeros 

Im Allgemeinen sollten Sie mehr Python Code wie Listenverständnis (in Ihrem Beispiel: [0 for unused in xrange(100)]) oder string.join für Puffer verwenden.

+3

Ich stimme zu, dass das Listenverständnis pythonischer aussieht. Ich habe es jedoch zeitlich abgestimmt und festgestellt, dass es etwa 10x langsamer als die Multiplikationssyntax ist. Ich weiß, etwas Pre-Optimierung etwas Böses. – Lenna

+0

Ich erstelle ein 'array ('I')' und verwende '(0 für i im Bereich (count)) 'um zu füllen ... und es ist sehr langsam: 28000 Elemente im Array. Die Multiplikationssyntax ist viel schneller. Wenn 'Python' zu langsam ist, dann ist es mit dem 'Python' und mit * schnell *. – IAbstract

11

Verwendung numpy

import numpy 
zarray = numpy.zeros(100) 

Und dann verwenden Sie die Histogram Bibliotheksfunktion

+2

Sorry, aber numpy.zeros wurde explizit ausgeschlossen. –

0

Je nachdem, was Sie vorhaben, die mit den Daten zu tun, nachdem sie gesammelt hat, könnte collections.defaultdict (int) nützlich sein .

16

verwenden:

bucket = [None] * 100 
for i in range(100): 
    bucket[i] = [None] * 100 

ODER

w, h = 100, 100 
bucket = [[None] * w for i in range(h)] 

Beide werden Ausgang richtige leere mehrdimensionale Bucket List 100x100

+0

Was ist mit 'Eimer = [[0] * w] * h'? – RobinHood

77

Nur der Vollständigkeit halber: Um eine mehrdimensionale Liste von Nullen in Python zu erklären Sie müssen ein Listenverständnis wie folgt verwenden:

buckets = [[0 for col in range(5)] for row in range(10)] 

, um eine Referenzfreigabe zwischen den Zeilen zu vermeiden.

Das sieht etwas unbeholfener aus als der Code von chester1000, ist aber wichtig, wenn die Werte später geändert werden sollen. Weitere Informationen finden Sie unter Python FAQ.

+0

Yup, du hast recht, es sei denn, du willst aus einem seltsamen Grund n Kopien desselben Arrays bearbeiten :) – meeDamian

-1

Nun würde Ich mag Ihnen helfen, indem sie ein Beispielprogramm und seine Ausgabe veröffentlichen

Programm: -

t=input("") 

x=[None]*t 

y=[[None]*t]*t 

for i in range(1,t+1): 

     x[i-1]=i; 
     for j in range(1,t+1): 
      y[i-1][j-1]=j; 

print x 

print y 

Ausgang: -

2 

[1, 2] 

[[1, 2], [1, 2]] 

Ich hoffe, dass dies eine sehr grundlegende löscht Konzept von Ihnen bezüglich ihrer Erklärung. Um sie mit einigen anderen spezifischen Werten zu initialisieren, wie sie mit 0 initialisiert werden.Sie können sie als erklären:

x = [0] * 10

Hoffe, es hilft .. !! ;)

-2

Wenn Sie mehr Spalten benötigen:

buckets = [[0., 0., 0., 0., 0.] for x in range(0)] 
1

Die Frage sagt "Wie Array aus Nullen ... erklären", aber der Beispielcode verweist auf die Python-Liste dann:

buckets = [] # this is a list 

Allerdings, wenn jemand tatsächlich fehlt ein Array zu initialisieren, schlage ich vor:

from array import array 

my_arr = array('I', [0] * count) 

Der Python Purist könnte dies behaupten nicht pythonic und vorschlagen:

my_arr = array('I', (0 for i in range(count))) 

Die pythonic Version sehr langsam ist und wenn Sie ein paar hundert Arrays mit Tausenden von Werten initialisiert werden, der Unterschied ist, ziemlich auffällig.

Verwandte Themen