2017-09-12 39 views
5

Giả sử tôi có mảng đơn giản này:Mảng thao tác trong python

simple_list = [  
    ('1', 'a', 'aa'),  
    ('2', 'b', 'bb'),  
    ('3', 'c', 'cc') 
] 

Nếu chúng ta xem xét danh sách này như một bảng, nơi các cột được phân cách bằng hôn mê và dòng ngăn cách bởi các bộ, tôi muốn tạo một hàm chỉ lấy các cột mà tôi muốn. ví dụ, chức năng này sẽ trông giống như một cái gì đó như thế này:

get_columns(array, tuple_columns_selector)) 

tôi muốn, ví dụ, để thu thập chỉ cột đầu tiên và thứ ba ra khỏi nó, trong trường hợp này, nó sẽ trả lại cho tôi mảng khác với các mới giá trị:

nếu tôi làm:

get_columns(simple_list, (0,2))  
get_columns(simple_list, (0,)) 

nó sẽ trở lại một cái gì đó như:

[('1', 'aa'), ('2', 'bb'), ('1', 'cc')]  
[1, 2, 3] 

Và cứ thế. Bạn có thể giúp tôi tạo hàm get_columns này không? Dưới đây là đoạn code tôi đã cố gắng:

def get_columns(arr, columns): 
    result_list = [] 
    for ii in arr: 
     for i in columns: 
      result_list.append(ii[i]) 
    return result_list 


to_do_list = [ 
    ('Wake Up', True), 
    ('Brush Teeh', True), 
    ('Go to work', True), 
    ('Take a shower', True), 
    ('Go to bed', False) 
] 

print(get_columns(to_do_list, (0,))) 
+3

Tôi chỉ cho bạn mã của tôi nếu bạn chỉ cho tôi của bạn :-) Ngay cả khi nó không chính xác, chỉ hiển thị những gì bạn đã thử. Chúng tôi có thể giúp bạn khắc phục. –

+0

Chào mừng bạn đến với StackOverflow. Vui lòng đọc [Cách hỏi] (https://stackoverflow.com/help/how-to-ask) và bao gồm chi tiết về những gì bạn đã thử, cụ thể, hiển thị cho chúng tôi một số mã mà bạn có thể đã cố viết. – Antimony

+0

Đây không phải là mảng. Nhưng thực ra, điều này nghe có vẻ như một trường hợp sử dụng tuyệt vời * cho các mảng thực tế *, cụ thể, có cấu trúc 'numpy.array's –

Trả lời

4

Sử dụng sự kỳ diệu của operator.itemgettermap:

from operator import itemgetter 

simple_list = [ 
    ('1', 'a', 'aa'), 
    ('2', 'b', 'bb'), 
    ('3', 'c', 'cc') 
] 

cols = (1,) # can be (0, 2) 
fn = itemgetter(*cols) 
print map(fn, simple_list) 

Returns:

[('1', 'aa'), ('2', 'bb'), ('3', 'cc')] 

khi cols(0, 2).

Và nó sẽ trả về:

[1,2,3] 

khi cols(1,).

Vì vậy, chức năng get_columns của bạn có thể

def get_columns(data, cols): 
    return map(itemgetter(*cols), data) 
+0

Ah, giải pháp rất tốt đẹp, tốt hơn nhiều so với những gì tôi đã nghĩ ban đầu. Điều này xử lý logic của OP về việc nhận các phần tử đơn lẻ hoặc một bộ các phần tử rất thanh lịch. –

+0

Chúc mừng, tôi mới lập trình, tôi không quen với các mô-đun nhưng đó là một cách rất thú vị để giải quyết nó. Một lần nữa xin cảm ơn. –

+0

Điều này có vẻ tuyệt vời! Cảm ơn vì đã dạy tôi điều gì đó mới mẻ. – Basya

2

Câu trả lời của @kopos có vẻ tốt đẹp, tôi chỉ muốn chia sẻ một mà không có thư viện bổ sung.

simple_list = [ 
    ('1', 'a', 'aa'), 
    ('2', 'b', 'bb'), 
    ('3', 'c', 'cc') 
] 

def get_columns(array, tuple_columns_selector): 
    return [tuple(elem[i] for i in tuple_columns_selector) for elem in array] 

def get_columns_multiple_lines(array, tuple_columns_selector): 
    # The only difference between the result of this version and the other is that this one returns a list of lists 
    # while the other returns a list of tuples 
    resulting_list = [] # Create the variable that will store the resulting list 
    for elem in array: # Loop for each element in array 
     resulting_list.append([]) # We add a new "empty row" to store all the columns needed 
     for i in tuple_columns_selector: # Loop for each column needed 
      resulting_list[-1].append(elem[i]) # We append the column value to the last item in resulting_list 
    return resulting_list 


print get_columns(simple_list, (0,2)) # outputs [('1', 'aa'), ('2', 'bb'), ('3', 'cc')] 
print get_columns(simple_list, (0,)) # outputs [('1',), ('2',), ('3',)] 
print get_columns_multiple_lines(simple_list, (0,2)) # outputs [['1', 'aa'], ['2', 'bb'], ['3', 'cc']] 

Sự khác biệt duy nhất là giá trị trả về khi tuple_columns_selector chỉ là một cột. Nếu đó là một sự khác biệt quan trọng, tôi có thể "sửa" nó, nhưng bạn nên suy nghĩ về cách giá trị đó sẽ được sử dụng và nếu nó thuận tiện cho nó để có cấu trúc khác nhau có thể.

+0

Cảm ơn một triệu, bạn đã thực hiện chính xác những gì tôi muốn. Đó là một chút bối rối đối với tôi điều này lót cho dù. Tôi chưa quen với nó nhưng tôi chắc chắn sẽ làm thế. Không, không cần thay đổi (1,) thành 1. Không sao đâu. –

+0

Tôi đã thêm một cách tiếp cận đơn giản hơn, không phải một dòng. –