2012-04-22 22 views
10
# 2x3 dimensional list 
multidim_list = [ 
        [1,2,3], 
        [4,5,6],  
       ] 
# 2x3x2 dimensional list 
multidim_list2 = [ 
        [ 
        [1,2,3], 
        [4,5,6], 
        ], 
        [ 
        [7,8,9], 
        [10,11,12], 
        ] 
       ] 

def multiply_list(list): 
    ... 

Tôi muốn triển khai hàm, sẽ nhân tất cả các phần tử trong danh sách theo hai. Tuy nhiên, vấn đề của tôi là danh sách có thể có số lượng kích thước khác nhau.Python: Lặp lại các danh sách với số lượng kích thước khác nhau, có cách nào chung không?

Có cách nào chung để lặp/lặp lại danh sách đa chiều và ví dụ nhân mỗi giá trị cho hai?

EDIT1: Cảm ơn câu trả lời nhanh. Đối với trường hợp này, tôi không muốn sử dụng numpy. Việc đệ quy có vẻ tốt, và thậm chí nó không cần phải sao chép danh sách, có thể là khá lớn.

Trả lời

15

Đệ quy là bạn của bạn:

from collections import MutableSequence 
def multiply(list_): 
    for index, item in enumerate(list_): 
     if isinstance(item, MutableSequence): 
      multiply(item) 
     else: 
      list_[index] *= 2 

Bạn chỉ có thể làm isinstance(item, list) thay vì isinstance(item, MutableSequence), nhưng cách thứ hai là futureproof hơn và chung chung. Xem the glossary để có giải thích ngắn.

+0

Đây là những gì tôi muốn. Nó đã được từ lâu tôi đã sử dụng đệ quy, gần như đã quên nó. Và tôi không muốn sử dụng numpy cho trường hợp này. – JoonasS

+0

"... nó cũng là cách kiểm tra như vậy được thực hiện trong các thư viện python." Chỉ cần ra khỏi tò mò - những gì các thư viện Python bạn có trong tâm trí ở đây? –

+0

@Sven Busted. Tìm kiếm "pin" tôi đã tìm thấy không kiểm tra như vậy. Gần nhất tôi đến là shutil sử dụng 'isinstance (function, collections.Callable)'. Có rất nhiều kiểm tra 'isinstance (x, list)'. Tôi _thougth_ bất cứ nơi nào một hàm hoặc lớp được xây dựng sẵn cần kiểm tra kiểu args của nó (ví dụ như nó là một danh sách hoặc một dict) nó sẽ làm điều này bằng cách sử dụng ABC trong 'collections', để người dùng có thể thay thế' list 'đối tượng với một lớp con' MutableSequence' và vẫn có nó hoạt động. Thành thật mà nói, tôi nghĩ rằng đây là một lý do lớn tại sao họ giới thiệu ABCs ở nơi đầu tiên. Tôi sẽ chỉnh sửa câu trả lời của mình. –

3

numpy mảng làm điều đó ra khỏi hộp.

8

Bạn có thể tận dụng NumPy:

import numpy as np 

arr_1 = np.array(multidim_list) 
arr_2 = np.array(multidim_list2) 

Kết quả:

>>> arr_1*2 
array([[ 2, 4, 6], 
     [ 8, 10, 12]]) 
>>> arr_2*2 
array([[[ 2, 4, 6], 
     [ 8, 10, 12]], 

     [[14, 16, 18], 
     [20, 22, 24]]]) 
Các vấn đề liên quan