2014-04-13 12 views
5

Tôi có mảng đa chiều này:Làm thế nào để trừ mảng đa chiều trong Python?

n = [[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]] 

Tôi muốn trừ tất cả trong số họ có 1. Vì vậy, kết quả sẽ là:

result = [[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
+2

Cân nhắc nhận [NumPy] (http://www.numpy.org/). Nó ma trận toán học tốt hơn nhiều so với việc sử dụng danh sách các danh sách. – user2357112

+0

@ user2357112 Numpy là tốt nói chung, nhưng nó không thực sự làm việc cho trường hợp cụ thể này - vì các danh sách lồng nhau có độ dài khác nhau, 'np.array (n)' cho một mảng với dtype = object chứ không phải int, và vì vậy 'np.array (n) - 1' là một TypeError (trong khi nếu chúng có cùng kích thước, nó sẽ chính xác là câu trả lời). – lvc

Trả lời

4

Nếu bạn có một danh sách liệt kê chắc chắn, sử dụng một lồng danh sách hiểu:

In [13]: result = [[e-1 for e in i] for i in n] 

In [14]: print result 
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
2
for x in n: 
    for i, y in enumerate(x): 
     x[i] = y - 1 

Đây là hiệu quả hơn, spacewise ít nhất.

hoặc nếu bạn muốn sử dụng danh sách hiểu lồng nhau như zhangxaochen đã nhưng gán nó với giá trị tương tự như vậy nó có phải nó tại chỗ:

n[:] = [[b - 1 for b in a] for a in n] 

Lưu ý rằng điều này thực sự vẫn tạo ra hai danh sách thêm để nó có cùng một không gian phức tạp như gán nó vào một mảng mới.

1
result=n 
for a in range(len(n)): 
    for b in range(len(n[a])): 
     result[a][b]=n[a][b]-1 
+0

'result = n' chỉ làm cho phần còn lại giống như gán vào' n'. Có lẽ bạn có nghĩa là kết quả phải là một bản sao sâu của n, mà sẽ phải là 'kết quả = [m [:] cho m trong n]'. – lvc

1

Hoặc bạn có thể sử dụng map():

>>> import operator 
>>> n = [[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]] 
>>> map(lambda x: map(lambda y: operator.sub(y, 1), x), n) 
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
1
def difference(a, n): 
    try: 
     return a - n 
    except TypeError: 
     return [difference(i, n) for i in a] 

>>> difference([[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]], 1) 
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
>>> difference([3, [1, 9, [1, 2, [3, 4, [5, 6]]]], [2], [[3, 4], [5, 6]], [3], [7, 10]], 1) 
[2, [0, 8, [0, 1, [2, 3, [4, 5]]]], [1], [[2, 3], [4, 5]], [2], [6, 9]] 

Nó hoạt động cho tất cả các danh sách đa chiều.

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