【问题标题】:How to get string values from two dimensional array and assign to a one dimensional array?如何从二维数组中获取字符串值并分配给一维数组?
【发布时间】:2016-07-15 19:54:36
【问题描述】:

假设我有以下二维数组:

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

但事实并非如此。

我认为我的代码逻辑有问题。但我无法确定问题所在,有什么想法吗?

【问题讨论】:

  • 你希望if(i_array &lt;=iterator):做什么?

标签: python arrays string multidimensional-array iteration


【解决方案1】:

使用列表推导:

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

【讨论】:

    【解决方案2】:

    您正在遍历 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】:

      一个非常紧凑的方法是使用内置的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']
      

      【讨论】:

      • 基础 Python,这是最好的方法!
      • @ColonelBeauvel .. 你为什么说这是最好的方法?...列表理解一个怎么样?
      • @Iron Fist,为了速度和简洁。然而,出于阅读目的,它比未启动的列表理解更难。
      • @IronFist:嗯,zip 用 C 编写的……至少,它是用标准 Python(又名 CPython)编写的。如果你有兴趣,这里是相关的source code
      • @IronFist:OTOH,看看速度差异是什么,应该做一些适当的timeit 测试。但我现在没有时间这样做......
      【解决方案4】:

      如您所见,有很多方法。对于目前的情况,我认为最好的是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)))
      

      【讨论】:

      • FWIW,我怀疑 OP 使用的是 Python 2(否则在将 intrange 对象进行比较时会出错)。而在 Python 2 中,list 调用可以省略,因为 Python 2 的 map 返回一个 list 而不是一个迭代器。
      【解决方案5】:

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

      简单修复:

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

      如果这没有帮助,我很抱歉,但我无法要求您澄清您想要达到的目标(没有足够的声誉)。

      【讨论】:

        【解决方案6】:

        根据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 进行了测试。

        【讨论】:

          猜你喜欢
          • 2021-12-07
          • 1970-01-01
          • 1970-01-01
          • 2017-12-12
          • 2017-01-13
          • 1970-01-01
          • 1970-01-01
          • 2020-07-27
          • 1970-01-01
          相关资源
          最近更新 更多