【问题标题】:How can i create this nested list using list comprehension?如何使用列表理解创建这个嵌套列表?
【发布时间】:2025-11-25 05:00:01
【问题描述】:

每次我尝试使用列表理解创建嵌套列表时,最终都会让人头疼或出现错误。我有一个我正在使用的四个变量的转置数据框,每个变量有 9 列。例如:

Date0, Date1, Date2, Date3 ... Date 9
GMV0, GMV1, GMV2, GMV3 .... GMV9
Revenue0, Revenue1, Revenue2, Revenue3 .... Revenue9

我正在尝试为这些列中的每一列创建一个嵌套列表。所需列表如下:

[[Date0, GMV0, Revenue0], [Date1, GMV1, Revenue1], [Date2, GMV2, Revenue2] ... [Date9, GMV9, Revenue9]]

我目前可以使用

创建所需的列表
date=[col for col in test.columns if 'Date' in col]
gmv=[col for col in test.columns if 'GMV' in col]
rev=[col for col in test.columns if 'Gross Revenue' in col]

vars=[[Date[i], gmv[i], rev[i]] for i in range(len(Date))]

但这效率很低,我很肯定这是一个单行代码。

有人可以帮助我正确理解列表(或者可能是其他特定于转置数据的方法)并帮助我理解它吗?

【问题讨论】:

    标签: python pandas list


    【解决方案1】:

    你可以使用to_dict:

    >>> df
              0         1         2         3         4
    0     Date0     Date1     Date2     Date3     Date9
    1      GMV0      GMV1      GMV2      GMV3      GMV9
    2  Revenue0  Revenue1  Revenue2  Revenue3  Revenue9
    
    >>> list(df.to_dict(orient='list').values())
    
    [['Date0', 'GMV0', 'Revenue0'],
     ['Date1', 'GMV1', 'Revenue1'],
     ['Date2', 'GMV2', 'Revenue2'],
     ['Date3', 'GMV3', 'Revenue3'],
     ['Date9', 'GMV9', 'Revenue9']]
    

    更新

    >>> df
      Date0 Date1 Date2 Date3 GMV0 GMV1 GMV2 GMV3 Revenue0 Revenue1 Revenue2 Revenue3
    0     A     B     C     D    E    F    G    H        I        J        K        L
    
    
    >>> [list(t.columns) for _, t in df.groupby(df.columns.str.extract(r'(\d+)', expand=False), axis=1)]
    
    [['Date0', 'GMV0', 'Revenue0'],
     ['Date1', 'GMV1', 'Revenue1'],
     ['Date2', 'GMV2', 'Revenue2'],
     ['Date3', 'GMV3', 'Revenue3']]
    

    【讨论】:

    • 这对我不起作用。我的数据是结构,因此每列都是具有关联值的变量名,您的示例将每行值作为变量名。
    • 您的意思是 DateX、GMVX 和 RevenueX 是您的列名吗?
    • 是的,就是这样。
    • 你能看看我更新的答案吗?
    • 更新后的代码返回一个空列表。考虑到您在示例中的 df 结构与我的完全一样,这很奇怪。
    【解决方案2】:

    您可以将列表推导与嵌套的for 子句一起使用。

    vars = [
        col
        for key in ['Date', 'GMV', 'Gross Revenue']
        for col in test.columns if key in col
    ]
    

    参考:https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries

    或者,如果您已经有三个列表,您可以使用内置函数zip。这就像一个转置。

    vars = list(zip(date, gmv, rev))
    

    更新:

    对不起,误解了这个问题。如果您需要嵌套列表,以下代码将起作用。

    vars = list(zip(*(
        [col for col in test if key in col]
        for key in ['Date', 'GMV', 'Gross Revenue']
    )))
    

    如果您已经在使用 DataFrame,@Corralien 的回答会更好。当您想通过 vanilla Python 执行此操作时,此答案很有用。

    【讨论】:

    • 这行得通。谢谢!
    • 对不起,我说这个解决方案太快了。我得到的输出不是嵌套列表,它是:[Date0, Date1, Date2, Date3 ... GMV0, GMV1, GMV2, GMV3, etc]
    【解决方案3】:

    如果输入列表是:

    >>> test = [['a1','a2','a3'],['b1', 'b2','b3'],['c1','c2','c3']]
    

    然后

    >>> b = [[test[x][i] for x in range(len(test))] for i in range(len(test[0]))]
    
    >>> b
    [['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'], ['a3', 'b3', 'c3']]
    

    为了理解:尝试 i=0 then i=1 ... 的内循环结果 ...

    >>> i = 0
    >>> [test[x][i] for x in range(len(test))]
    

    【讨论】: