2010-02-05 34 views
8

Tôi có mảng 2d, tôi muốn đặt cột thành giá trị cụ thể, mã của tôi ở bên dưới. Đây có phải là cách tốt nhất trong python?Python - cách tốt nhất để đặt cột trong mảng 2d thành giá trị cụ thể

rows = 5 
cols = 10 

data = (rows * cols) *[0] 
val = 10 
set_col = 5 

for row in range(rows): 
    data[row * cols + set_col - 1] = val 

Nếu tôi muốn thiết lập một số cột để một giá trị đặc biệt, làm thế nào tôi có thể mở rộng này

Tôi muốn sử dụng python thư viện tiêu chuẩn duy nhất

Cảm ơn

+6

Tôi biết bạn muốn chỉ các thư viện chuẩn, nhưng NumPy đã được thực hiện cho việc này. – telliott99

Trả lời

11

Một giải pháp tốt hơn sẽ là:

data = [[0] * cols for i in range(rows)] 

Đối với các giá trị của cols = 2, rows = 3 chúng tôi nhận được:

data = [[0, 0], 
     [0, 0], 
     [0, 0]] 

Sau đó, bạn có thể truy cập nó như:

v = data[row][col] 

Dẫn đến:

val = 10 
set_col = 5 

for row in range(rows): 
    data[row][set_col] = val 

Hoặc càng Pythonic (nhờ J.F. Sebastian):

for row in data: 
    row[set_col] = val 
+5

Không cần sử dụng chỉ mục hàng rõ ràng: 'cho hàng trong dữ liệu: \ n hàng [col_index] = giá trị' – jfs

0

Có không có gì sai với cách bạn đang sử dụng, ngoại trừ việc nó sẽ rõ ràng hơn để đặt tên biến là set_col hơn set_row vì bạn đang thiết lập một cột.

Vì vậy, thiết lập một số cột, chỉ cần quấn nó với vòng lặp khác:

for set_col in [...columns that have to be set...] 

Một mối quan tâm, mặc dù: mảng 2D của bạn là không bình thường ở chỗ nó được đóng gói trong một mảng 1D (Python có thể hỗ trợ mảng 2D qua danh sách các danh sách), vì vậy tôi sẽ bọc tất cả bằng các phương thức hoặc hàm.

+0

Thnks eli, tôi đã sửa chữa – mikip

0

Trong trường hợp hàng và cột của bạn có lẽ hoán đổi cho nhau, tức là nó là vấn đề của ngữ nghĩa được mà. Nếu đây là trường hợp, sau đó bạn có thể làm cho cột để chiếm chuỗi các tế bào trong danh sách data, và sau đó bằng không họ chỉ sử dụng:

data[column_start:column_start+rows] = rows * [0] 
0

Một câu trả lời trước đó đã bỏ rơi một range, vì vậy bạn có thể thử như sau:

cols = 7 
rows = 8 

data = [[0] * cols for i in range(rows)] 

val = 10 
set_col = 5 

for row in data: 
    row[set_col] = val 

để mở rộng số này thành một số cột, bạn có thể lưu trữ số cột và giá trị của nó trong một dict. Vì vậy, để thiết lập cột 5-10 và cột 2-7:

cols = 7 
rows = 8 

data = [[0] * cols for i in range(rows)] 

valdict = {5:10, 2:7} 

for col, val in valdict.items(): 
    for row in data: 
     row[col] = val 

Việc trao đổi các hàng và cột, như đề xuất trong câu trả lời khác, làm cho điều này hơi đơn giản:

cols = 7 
rows = 8 

data = [[0] * rows for i in range(cols)] 

valdict = {5:10, 2:7} 

for col, val in valdict.items(): 
    data[col] = [val] * rows 
26

NumPy gói cung cấp N mạnh mẽ đối tượng mảng chiều.Nếu data là một mảng numpy sau đó để thiết lập set_col cột giá trị val:

data[:, set_col] = val 

Hoàn Ví dụ:

>>> import numpy as np 
>>> a = np.arange(10) 
>>> a.shape = (5,2) 
>>> a 
array([[0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7], 
     [8, 9]]) 
>>> a[:,1] = -1 
>>> a 
array([[ 0, -1], 
     [ 2, -1], 
     [ 4, -1], 
     [ 6, -1], 
     [ 8, -1]]) 
+0

Tôi giữ câu trả lời trong giới hạn của thư viện chuẩn, nhưng tôi có thể nói đây là cách phù hợp để sử dụng các mảng không tầm thường. –

+0

Cụ thể, bạn có thể thực hiện việc gán nhiều cột một cách dễ dàng. Ví dụ: [:, [0,2]] + = [3,5] – telliott99

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