2010-10-30 30 views
116

Tôi đang cố gắng xây dựng một biểu đồ đếm ... vì vậy tôi tạo ra các thùng. Tôi biết tôi chỉ có thể đi qua và nối thêm một loạt các số không tức là một cái gì đó dọc theo những dòng:Làm thế nào để khai báo mảng số không trong python (hoặc một mảng có kích thước nhất định)

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

Có một cách thanh lịch hơn để làm điều đó? Tôi cảm thấy như có một cách để khai báo một mảng có kích thước nhất định.

Tôi biết NumPy có numpy.zeros nhưng tôi muốn các giải pháp tổng quát hơn

+2

Danh sách của Python là danh sách chứ không phải mảng. Và trong Python bạn không khai báo các công cụ như bạn làm trong C: bạn định nghĩa các hàm và các lớp (thông qua các câu lệnh def và class), và gán cho các biến, nếu chúng chưa tồn tại, được tạo một cách kỳ diệu vào lần gán đầu tiên. Ngoài ra, các biến (và danh sách) không phải là vùng bộ nhớ có chứa, nhưng các tên tham chiếu đến, các đối tượng. Một đối tượng chỉ có thể được chứa trong một vùng bộ nhớ nhưng có thể được tham chiếu bằng một vài tên. – pillmuncher

+1

Python không có "khai báo", đặc biệt là các vùng chứa có kích thước nhưng nội dung không xác định. Bạn muốn một cái gì đó, bạn viết một biểu thức. –

+3

... và dấu chấm phẩy hoàn toàn không cần thiết – bstpierre

Trả lời

250
buckets = [0] * 100 
+18

Cẩn thận - [kỹ thuật này không khái quát hóa các mảng đa chiều hoặc danh sách các danh sách] (https://docs.python.org/2/faq/programming.html#how-do -i-tạo-một-đa-chiều-danh sách). – rphv

15

Bạn có thể nhân một list bởi một số nguyên n lặp lại listn lần:

buckets = [0] * 100 
3

Giải pháp đơn giản nhất sẽ là

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

Nói chung, bạn nên sử dụng nhiều mã pythonic như danh sách hiểu (trong ví dụ của bạn: [0 for unused in xrange(100)]) hoặc sử dụng string.join cho bộ đệm.

+3

Tôi đồng ý rằng việc hiểu danh sách trông giống Pythonic hơn. Tuy nhiên, tôi đã hẹn giờ nó, và thấy rằng nó là khoảng 10 lần chậm hơn so với cú pháp nhân. Tôi biết, một cái gì đó một cái gì đó preoptimization ác. – Lenna

+0

Tôi đang tạo một 'mảng ('I')' và đang sử dụng '(0 cho i trong phạm vi (đếm))' để điền ... và nó rất chậm: 28000 mục trong mảng. Cú pháp nhân nhanh hơn nhiều. Nếu 'pythonic' tương đương với chậm, sau đó nó ra với 'pythonic' và với * nhanh *. – IAbstract

11

sử dụng NumPy

import numpy 
zarray = numpy.zeros(100) 

Và sau đó sử dụng chức năng Histogram thư viện

+2

Xin lỗi, nhưng numpy.zeros đã bị loại trừ một cách rõ ràng. –

0

Tùy thuộc vào những gì bạn đang thực sự sẽ làm gì với dữ liệu sau khi được thu thập, collections.defaultdict (int) có thể có ích .

16

Sử dụng này:

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

HOẶC

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

Cả hai trong số họ sẽ đầu ra thích hợp rỗng đa chiều danh sách xô 100x100

+0

Còn về 'bucket = [[0] * w] * h'? – RobinHood

77

Chỉ cần cho đầy đủ: Để khai báo một danh sách đa chiều của zeros trong python bạn phải sử dụng danh sách hiểu như sau:

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

để tránh chia sẻ tham chiếu giữa các hàng.

Điều này có vẻ vụng về hơn mã của chester1000, nhưng là điều cần thiết nếu các giá trị được cho là thay đổi sau này. Xem Python FAQ để biết thêm chi tiết.

+0

Yup, bạn nói đúng, trừ khi vì một số lý do lạ bạn muốn hoạt động trên n bản sao của cùng một mảng :) – meeDamian

-1

Vâng, tôi muốn giúp bạn bằng cách đăng một chương trình mẫu và sản lượng của nó

chương trình: -

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 

Output: -

2 

[1, 2] 

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

Tôi hy vọng điều này sẽ xóa một số rất cơ bản khái niệm về bạn về tuyên bố của họ. Để khởi tạo chúng với một số giá trị cụ thể khác, như khởi tạo chúng bằng 0 ..bạn có thể khai báo chúng là:

x = [0] * 10

Hy vọng nó sẽ giúp .. !! ;)

-2

Nếu bạn cần thêm cột:

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

Câu hỏi đặt ra nói "Làm thế nào để khai báo mảng các zeros ..." nhưng sau đó các mẫu mã tham chiếu danh sách Python:

buckets = [] # this is a list 

Tuy nhiên, nếu ai đó thực sự muốn khởi tạo một mảng, tôi đề nghị:

from array import array 

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

Các Python purist có thể khẳng định đây không phải là pythonic và đề nghị:

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

Các pythonic phiên bản là rất chậm và khi bạn có một vài trăm mảng được khởi tạo với hàng ngàn các giá trị, sự khác biệt là khá đáng chú ý.

Các vấn đề liên quan