【发布时间】:2019-02-21 15:13:30
【问题描述】:
我运行了一个创建多个变量的 python 脚本。现在我想迭代一些与特定模式匹配的数据帧(由脚本创建)并对它们执行简单的操作。最初我想获取list_dfs中每个数据帧的行数(带有shape()),如下图:
['FAILEDRuns_0112',
'FAILEDRuns_0121',
'FAILEDRuns_0126',
'FAILEDRuns_0129',
'FAILEDRuns_0131',
'FAILEDRuns_0134',
'FAILEDRuns_0135',
'FAILEDRuns_0137',
'FAILEDRuns_0142',
'FAILEDRuns_0153',
'FAILEDRuns_0165',
'FAILEDRuns_0171',
'FAILEDRuns_0175']
事实上,如果我这样做:
for i in list(filter(failed_runs_finder.findall, dir())):
print(locals()[i].shape[0])
我得到了打印到屏幕上的行数:
1
0
0
0
1
0
0
0
0
0
0
0
0
其中包含我需要的信息,但不是我想要的格式。最终我需要知道的是 1 的数量和零的数量,所以我想得到一个列表理解,最终将总和(即 1 的数量)与列表的长度(即总数)进行比较元素。
但是,如果我这样做:
[locals()[i].shape[0] for i in list_dfs]
我收到以下错误:
KeyError: 'FAILEDRuns_0112'
我不太明白错误来自哪里。据我所知,它不是列表推导的语法。
这与在列表理解中使用 locals() 有什么关系吗?
我的第二个选择是迭代地构建一个 df 并得到总和,尽管我认为列表理解更简单,而且我不太明白错误来自哪里。
【问题讨论】:
-
用
sum表示1 的数目,用len-sum表示0 的数目不是更方便吗? -
在for循环中你做了
print(locals()[i].shape),为什么在列表理解中变成了shape[0]。 -
在 Python3 中,list comprehensions have their own scope.
-
@Rocky Li:确实,代码与输出不匹配,但对我来说,很奇怪我可以在
for循环中做,但不能用列表理解。 -
为什么你有这么多类似命名的局部变量而不是一个
dict?
标签: python for-loop list-comprehension