2016-03-28 45 views
2

假設我有以下二維數組:如何從二維數組中獲取字符串值並將其分配給一維數組?

m_array = [['String A', 1, 1.1, 'haha'], 
      ['String B', 2, 0.9, 'haha'], 
      ['String C', 0, 1.1, 'haha'], 
      ['String D', 3, 0.9, 'haha']] 

的事:我想提取0指數值這個多陣列,即「字符串A」,「串B ','String C','String C'並將其存儲在一個數組中:s_array動態。

問題:我使用for循環遍歷所有值。下面是代碼

# create a single dimensional array 
    s_array = [] 
    # Iterator is the length of the m_array. (Which should be 4; 0-index, 1-index, 2-index and 3-index  
    iterator = range(len(m_array)) 

    i_array = 0 

    if(i_array <=iterator): 
     for str_value in m_array[i_array][0]: 
      s_array.append(str_value) 

此時s_array應具有:

s_array['String A', 'String B', 'String C', 'String D']

但它不會。

我認爲我的代碼的邏輯有問題。但我無法確定問題,有什麼想法?

+0

你期望如果(i_array <=迭代器):'做什麼? –

回答

2

使用列表理解:

s_array = [sublist[0] for sublist in m_array] 
print s_array 
>>> ['String A', 'String B', 'String C', 'String D'] 
1

您是通過每個項目m_array[i_array][0]迭代和追加每一個項目,而不是附加的整個列表。你並不需要使用索引,但是,因爲你可以通過m_array迭代:

s_array = [] 
for array in m_array: 
    s_array.append(array[0]) 

當所有一for循環的作用是增加事情的清單,那就是你也許可以使用list comprehension標誌:

s_array = [array[0] for array in m_array] 
2

一個非常緊湊的方式做,這是使用內置的zip功能。鑑於

m_array = [['String A', 1, 1.1, 'haha'], 
      ['String B', 2, 0.9, 'haha'], 
      ['String C', 0, 1.1, 'haha'], 
      ['String D', 3, 0.9, 'haha']] 

然後

zip(*m_array) 

回報

[('String A', 'String B', 'String C', 'String D'), (1, 2, 0, 3), (1.1000000000000001, 0.90000000000000002, 1.1000000000000001, 0.90000000000000002), ('haha', 'haha', 'haha', 'haha')] 

這是因爲* 「圖示」 運營商在解壓縮的m_array物品和通過每一個作爲參數傳遞給zip。請參閱官方Python教程中的Unpacking Argument Lists

所以我們只需要提取第一個元組並將其轉換爲列表。

s_array = list(zip(*m_array)[0]) 
print(s_array) 

輸出

['String A', 'String B', 'String C', 'String D'] 
+0

基礎Python,這是最好的方法! –

+1

@ColonelBeauvel ..爲什麼你說這是最好的方法?......列表理解怎麼樣? –

+0

@ColonelBeauvel:謝謝!我猜它比BAH的列表comp要浪費更多的內存; OTOH,它可能(可能)更快,尤其是如果子列表很長,因爲'zip'循環發生在C速度,而不是列表comp'for'循環的Python速度。 –

0

正如你可以看到有很多方法。最好的情況是,我認爲是list comprehension

一項更有趣的方法是使用mapitemgetter

m_array = [['String A', 1, 1.1, 'haha'], 
      ['String B', 2, 0.9, 'haha'], 
      ['String C', 0, 1.1, 'haha'], 
      ['String D', 3, 0.9, 'haha']] 

from operator import itemgetter 

print(list(map(itemgetter(0), m_array))) 
+1

FWIW,我懷疑OP是使用Python 2(否則他們'將'int'與'range'對象進行比較時會出錯)。在Python 2中,'list'調用可以省略,因爲Python 2的'map'返回一個'list'而不是一個迭代器。 –

0

我想看到的問題。您正在遍歷「字符串A」而不是m_array。 m_array [i_array] [0]是「字符串A」,您不會更改i_array的值。

簡單的解決方法:

for sublist in m_array: 
    s_array.append(sublist[0]) 

我很抱歉,如果這沒有幫助,但我不能要求澄清什麼是你想實現(沒有足夠的聲望)。

0

PM 2RING的答覆意見,我做了一些剖析測試它揭示了以下結果:

>>> import timeit 
>>> timeit.timeit('[x[0] for x in m_array]', "m_array = [['String A', 1, 1.1, 'haha'], ['String B', 2, 0.9, 'haha'],['String C', 0, 1.1, 'haha'],['String D', 3, 0.9, 'haha']]",number = 10**6) 
0.3232365940002637 
>>> timeit.timeit('list(zip(*m_array))[0]', "m_array = [['String A', 1, 1.1, 'haha'], ['String B', 2, 0.9, 'haha'],['String C', 0, 1.1, 'haha'],['String D', 3, 0.9, 'haha']]",number = 10**6) 
0.6186811590014258 

注:在我的Ubuntu 14.04箱,聯想ThinkPad超極本進行的,與酷睿i7 測試。

相關問題