使用字典而不是 globals()
Posted
技术标签:
【中文标题】使用字典而不是 globals()【英文标题】:Using Dictionaries instead of globals() 【发布时间】:2020-12-17 17:30:37 【问题描述】:我正在做一个关于检索股票信息的商业案例。老师使用下面的代码创建带有股票信息的DataFrame。
#The tech stocks we'll use for this analysis
tech_list = ['AAPL','GOOG','MSFT','AMZN']
#Set up End and Start times for data grab
end = datetime.now()
start = datetime(end.year - 1,end.month,end.day)
#For loop for grabing yahoo finance data and setting as a dataframe
for stock in tech_list:
# Set DataFrame as the Stock Ticker
globals()[stock] = DataReader(stock,'yahoo',start,end)
他使用globals()
使用 techstock 创建 4 个数据框。我在下面的问题中读到,您也可以使用字典来实现相同的目标。
pandas set names of dataframes in loop
我的问题是我不明白答案中的这行代码:
frames = i:dat for i, dat in data.groupby('Sport')
谁能解释一下?
【问题讨论】:
globals()
是一本字典
frames
是使用comprehension 构建的字典。调用data.groupby()
将返回一对值,称为i
和dat
,符号i:dat for i, dat in ...
正在从所有这些对中构建一个新字典,使用i
作为键,dat
作为价值。
也可以写成frames = dict(data.groupby('Sport'))
@Z4-tier 可能有一个规范的副本可以解释字典理解是什么,但我的列表中没有它。你有吗?
@Barmar 我找不到。很多涉及字典理解的问题,但我找不到只是解释它是什么的东西。我会发布一个答案,也许其他人会通过链接来。
【参考方案1】:
在这种情况下,frames
是使用字典理解构建的字典。调用data.groupby()
正在返回一对值,它们在理解中被称为i
和dat
,符号i:dat for i, dat in ...
正在从所有这些对中构建一个新字典,使用i
作为键和dat
作为值。结果存储在frames
。
一般语法是(对于迭代器返回 2 个元素的情况):
key: value for key, value in iterator
this question 的答案很好地解释了 Python 中的迭代器是什么。通常(但不总是),当在字典推导中使用时,迭代器的 __next__()
方法将返回两个元素。至少其中一个元素必须是可散列的,以便它可以用作字典键。
iterator
不一定需要返回两个元素(尽管这是一种常见的使用模式)。 This works:
print(dict([(i, chr(65+i)) for i in range(4)]))
0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'
并且还表明字典推导实际上只是使用与 列表推导 和 dict()
方法相同的机制的特殊语法,这就是 @Barmar 的评论所做的:
frames = dict(data.groupby('Sport'))
在这种情况下,data.groupby()
确实需要返回两个元素,并且顺序确实很重要,因为它是(大致)这个的简写:
dict([(key, value) for key, value in data.groupby('Sport')])
【讨论】:
感谢您的回复!现在我了解了字典理解背后的逻辑。只是最后一个疑问。示例中的数据框“frame”有 2 列(“Sport”和“random_data”)。如果会有另一列“玩家”怎么办,那么数据框“框架”有 3 列。如果我想创建一个字典理解来仅调用“运动”和“玩家”列,那么字典理解中的语法是什么?我尝试了以下方法,但它不起作用:'frames = i:dat for i in data.groupby('Sport'), dat in data['player'] ' 你可以这样做:sport: player: player_stats for player, player_stats in sport_stats.groupby('player') for sport, sport_stats in data.groupby('sport')
。这使用了嵌套的字典解析:因为sport_stats.groupby('sport')
返回看起来像('sport', DataFrame)
的对,所以内部解析将解包第一个DataFrame(我称之为sport_stats),这次按玩家分组,所以你得到(sport, (player, player_DataFrame))
。这是一个很好的例子,说明为什么使用有意义的名称而不是单个字母是好的:)以上是关于使用字典而不是 globals()的主要内容,如果未能解决你的问题,请参考以下文章
Python 两个内置函数: locals 和 globals