【问题标题】:Finding the Length of a Specific Column in a 2-Dimensional List在二维列表中查找特定列的长度
【发布时间】:2018-08-10 16:54:11
【问题描述】:

在 Python 3 中,如果我有一个二维列表,其中最后一行没有完全填写(如下示例),我如何获取特定列的长度?

[[1, 2, 3,],
 [4, 5, 6,],
 [7, 8,]]

例如,第 0 列和第 1 列的长度为 3,但第 2 列的长度为 2。有没有办法在不使用 pandas 模块的情况下做到这一点?

【问题讨论】:

  • max([len(l) for l in list_of_lists])
  • @chet-the-wizard:除了尝试回答,因此不适合发表评论,这是不对的——它总是会返回 a 的最大长度,而不是特定列的长度。
  • @DSM 这个问题的神秘本质让我很困惑。你是对的。
  • 你的列表有多乱?最后一行是唯一可能的缺失值吗?
  • @DSM 是的,OP声明“最后一行没有完全填写”。

标签: python list multidimensional-array multiple-columns content-length


【解决方案1】:

如果某列的索引大于或等于该行的长度,则该列丢失。也就是说,如果一行只有 2 个元素,则存在第 0 列和第 1 列,仅此而已。所以我们只需要统计长度大于索引的行数:

In [58]: L = [[1, 2, 3,], [4,], [7, 8,]]

In [59]: for row in L: print(row)
[1, 2, 3]
[4]
[7, 8]

In [60]: lens = [sum(len(row) > i for row in L) for i in range(max(map(len, L)))]

In [61]: lens
Out[61]: [3, 2, 1]

In [62]: L = [[1, 2, 3,], [4, 5, 6,], [7, 8,]]

In [63]: lens = [sum(len(row) > i for row in L) for i in range(max(map(len, L)))]

In [64]: lens
Out[64]: [3, 3, 2]

max(map(len, L)) 只是查找列数。如果您只关心特别查找一列,则可以使用sum(len(row) > column_number for row in L)

【讨论】:

    【解决方案2】:

    这是使用itertools.zip_longest的一种方式:

    from itertools import zip_longest
    
    lens = [sum(1 for _ in filter(None.__ne__, i)) for i in zip_longest(*L)]
    
    print(lens)
    
    [3, 3, 2]
    

    【讨论】:

      【解决方案3】:

      由于列表中间不能有空值,因此不完整的列始终是最后一列。不完整的列总是长度为len(lst) - 1,所以你可以使用:

      def lenCol(lst, col):
          num_rows = len(lst) # number of rows
          cutoff = len(lst[num_rows-1]) # length of last row, i.e. index where column is 1 shorter
          if col < cutoff:
              return num_rows # if before that index, then just number of rows
          else:
              return num_rows-1 # otherwise number of rows - 1
      

      不需要求和或任何映射函数,因为只有最后一行是不完整的,只是利用列表的属性。

      如果这对您的应用程序特别重要,那么它还有一个额外的好处是时间恒定。

      【讨论】:

        【解决方案4】:

        这会将您的行值列表更改为列值列表,其中缺失值用 None 填充:

        list_of_columns = map(list,map(None,*list_of_rows))
        

        然后列表推导并过滤掉列中的空值将为您提供列长度列表:

        column_lengths = [len(filter(None, col))) for col in list_of_columns]
        

        然后简单地索引(例如 lenof 第 2 列):

        column_lengths[2]
        out:
            2
        

        【讨论】:

          猜你喜欢
          • 2015-01-02
          • 2022-07-23
          • 2023-03-27
          • 2020-12-09
          • 2023-01-24
          • 2021-09-23
          • 2021-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多