2017-09-12 103 views
5

讓我們假設我有這個簡單的數組:數組操作

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

如果我們考慮到這個列表作爲一個表,其中列由元組分開昏迷和線分離,我想創建一個函數只檢索我想要的列。例如,這個功能看起來像這樣的事情:

get_columns(array, tuple_columns_selector)) 

我想要的,例如,只收集了它的第一個和第三列,在這種情況下,它會返回我的另一個數組新值:

如果我這樣做:

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

它會返回類似:

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

依此類推。你能幫我創建這個get_columns函數嗎?下面是我試過的代碼:

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

我告訴你我的代碼,如果你告訴我你的:-)即使它不正確,只顯示你已經嘗試過。我們可以幫助您解決問題。 –

+0

歡迎來到StackOverflow。請閱讀[如何提問](https://stackoverflow.com/help/how-to-ask),並且包含您所嘗試的內容的細節,具體來說,向我們展示您可能嘗試編寫的一些代碼。 – Antimony

+0

這些不是數組。但實際上,這聽起來像是一個很好的用於實際數組*的*,具體而言,結構化的'numpy.array' –

回答

4

使用的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) 

返回:

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

cols(0, 2)

,並返回:

[1,2,3] 

cols(1,)

所以你get_columns功能可以

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

啊,非常好的解決方案,比我最初想的要好得多。這處理OP的單元素或元素元組非常優雅的邏輯。 –

+0

乾杯,我是編程新手,我對模塊不是很熟悉,但這是解決它的一個非常有趣的方式。再次感謝。 –

+0

這看起來很酷!謝謝你教我新東西。 – Basya

2

@kopos的答案看起來不錯,我只是想分享一個無需額外的庫。

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']] 

唯一的區別是tuple_columns_selector只有一列時的返回值。如果這是一個重要的區別,我可以「糾正」它,但是你應該考慮如何使用這個價值,以及它是否適合具有不同的可能結構。

+0

非常感謝,你已經完成了我想要的。雖然這對我來說有點令人困惑。我還沒有習慣,但我肯定會。那麼,不需要將(1,)更改爲1.這很好。 –

+0

我添加了一個更簡單,而不是單行的方法。 –