首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用列表理解创建这个嵌套列表?

如何使用列表理解创建这个嵌套列表?
EN

Stack Overflow用户
提问于 2021-09-17 13:44:10
回答 3查看 91关注 0票数 2

每次我尝试使用列表理解创建嵌套列表时,结果都会让人头疼,或者说结果不正确。我有一个由四个变量组成的转置数据框架,每个变量有9列。例如:

代码语言:javascript
复制
Date0, Date1, Date2, Date3 ... Date 9
GMV0, GMV1, GMV2, GMV3 .... GMV9
Revenue0, Revenue1, Revenue2, Revenue3 .... Revenue9

我试图为这些列中的每一列创建一个嵌套列表。所需的清单如下:

代码语言:javascript
复制
[[Date0, GMV0, Revenue0], [Date1, GMV1, Revenue1], [Date2, GMV2, Revenue2] ... [Date9, GMV9, Revenue9]]

当前,我可以使用

代码语言:javascript
复制
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))]

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-17 13:51:47

您可以使用to_dict

代码语言:javascript
复制
>>> 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']]

更新

代码语言:javascript
复制
>>> 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']]
票数 3
EN

Stack Overflow用户

发布于 2021-09-17 13:51:35

您可以在嵌套的for子句中使用列表理解。

代码语言:javascript
复制
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。就像一个转座子。

代码语言:javascript
复制
vars = list(zip(date, gmv, rev))

最新情况:

很抱歉误解了这个问题。如果需要嵌套列表,下面的代码将有效。

代码语言:javascript
复制
vars = list(zip(*(
    [col for col in test if key in col]
    for key in ['Date', 'GMV', 'Gross Revenue']
)))

如果你已经在使用DataFrame,@Corr外星人的答案会更好。当你想用普通的Python来做时,这个答案是有用的。

票数 3
EN

Stack Overflow用户

发布于 2021-09-17 15:09:19

如果输入列表是:

代码语言:javascript
复制
>>> test = [['a1','a2','a3'],['b1', 'b2','b3'],['c1','c2','c3']]

然后

代码语言:javascript
复制
>>> 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的内部循环结果,然后i=1 .

代码语言:javascript
复制
>>> i = 0
>>> [test[x][i] for x in range(len(test))]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69224489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档