如何从二维数组中获取字符串值并分配给一维数组?

时间:2016-03-28 14:24:20

标签: python arrays string multidimensional-array iteration

假设我有以下二维数组:

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索引值,即'String A','String 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']

但事实并非如此。

我觉得我的代码逻辑出了问题。但我无法确定问题,任何想法?

6 个答案:

答案 0 :(得分:2)

使用列表理解:

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

答案 1 :(得分: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')]

那是因为*“splat”运算符解包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']

答案 2 :(得分: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]

答案 3 :(得分: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)))

答案 4 :(得分:0)

我认为看到了这个问题。您正在迭代“字符串A”而不是m_array。 m_array [i_array] [0]是“字符串A”,你没有改变i_array的值。

简单修复:

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

我很抱歉,如果这没有帮助,但我不能要求澄清你想要实现的目标(声誉不够)。

答案 5 :(得分: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 Box,LENOVO THINKPAD ULTRABOOK和CORE i7上进行测试。