【问题标题】:How to get every first element in 2 dimensional list如何获取二维列表中的每个第一个元素
【发布时间】:2015-07-15 17:53:16
【问题描述】:

我有一个这样的列表:

a = [[4.0, 4, 4.0], [3.0, 3, 3.6], [3.5, 6, 4.8]]

我想要这样的结果(每个列表中的第一个元素):

4.0, 3.0, 3.5

我试过a[::1][0],但没用

【问题讨论】:

标签: python list multidimensional-array


【解决方案1】:

您可以从列表理解中的每个元素中获取索引[0]

>>> [i[0] for i in a]
[4.0, 3.0, 3.5]

【讨论】:

  • 这似乎比 zip 方法干净得多。有什么理由不在 zip($*rows) 上使用它吗?
  • 拆包的变体是[first for first, *_ in a]
【解决方案2】:

使用邮编:

columns = zip(*rows) #transpose rows to columns
print columns[0] #print the first column
#you can also do more with the columns
print columns[1] # or print the second column
columns.append([7,7,7]) #add a new column to the end
backToRows = zip(*columns) # now we are back to rows with a new column
print backToRows

你也可以使用numpy:

a = numpy.array(a)
print a[:,0]

编辑: zip 对象不可下标。需要转换为列表才能作为列表访问:

column = list(zip(*row))

【讨论】:

  • 在python 3中,需要做list(zip(*rows)),否则不可下标。
  • 感谢这个不错的解决方案。你能解释一下 zip(*rows) 是如何转置二维列表的吗?
【解决方案3】:

你可以得到它像

[ x[0] for x in a]

这将返回a中每个列表的第一个元素的列表

【讨论】:

    【解决方案4】:

    比较三种方法

    1. 2D 列表:5.323603868484497 秒
    2. Numpy 库:0.3201274871826172 秒
    3. Zip(感谢 Joran Beasley):0.12395167350769043 秒
    D2_list=[list(range(100))]*100
    t1=time.time()
    for i in range(10**5):
        for j in range(10):
            b=[k[j] for k in D2_list]
    D2_list_time=time.time()-t1
    
    array=np.array(D2_list)
    t1=time.time()        
    for i in range(10**5):
        for j in range(10):
            b=array[:,j]        
    Numpy_time=time.time()-t1
    
    D2_trans = list(zip(*D2_list)) 
    t1=time.time()        
    for i in range(10**5):
        for j in range(10):
            b=D2_trans[j]
    Zip_time=time.time()-t1
    
    print ('2D List:',D2_list_time)
    print ('Numpy:',Numpy_time)
    print ('Zip:',Zip_time)
    

    Zip 方法效果最好。 当我必须在未安装 numpy 的集群服务器中为 mapreduce 作业执行一些列式处理时,它非常有用。

    【讨论】:

      【解决方案5】:

      你可以用这个:

      a = ((4.0, 4, 4.0), (3.0, 3, 3.6), (3.5, 6, 4.8))
      a = np.array(a)
      a[:,0]
      returns >>> array([4. , 3. , 3.5])
      

      【讨论】:

        【解决方案6】:

        如果你可以访问 numpy,

        import numpy as np
        a_transposed = a.T
        # Get first row
        print(a_transposed[0])
        

        这种方法的好处是,如果你想要二维列表中的“第二个”元素,你现在要做的就是a_transposed[1]a_transposed 对象已经计算过了,所以不需要重新计算。

        说明

        在二维列表中查找第一个元素可以重新表述为在二维列表中查找第一列。因为您的数据结构是a list of rows,所以对每行第一个索引处的值进行采样的一种简单方法是转置矩阵并对第一个列表进行采样。

        【讨论】:

          【解决方案7】:

          尝试使用

          for i in a :
            print(i[0])
          

          i 表示 a 中的单个行。所以,i[0] 表示每行的第一个元素。

          【讨论】:

          • 不按要求做。
          猜你喜欢
          • 1970-01-01
          • 2011-02-17
          • 2022-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多