Python 使用字典而不是全局()

Python 使用字典而不是全局(),python,pandas,dataframe,datareader,Python,Pandas,Dataframe,Datareader,我正在做一个关于检索股票信息的商业案例。教师使用下面的代码创建包含股票信息的数据帧 #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

我正在做一个关于检索股票信息的商业案例。教师使用下面的代码创建包含股票信息的数据帧

#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()。我在下面的问题中读到,你也可以使用字典来达到同样的目的

我的问题是,我不理解答案中的这一行代码:

frames = {i:dat for i, dat in data.groupby('Sport')}

有人能解释一下吗?

在本例中,
frames
是一个正在使用字典理解构建的字典。调用
data.groupby()
返回一对值,在理解中调用
i
dat
,符号
{i:dat for i,dat in…}
使用
i
作为键和
dat
作为值,从所有这些对中构建一个新的字典。结果存储在
帧中

一般语法是(对于迭代器返回2个元素的情况):

这些答案很好地解释了什么是python中的迭代器。通常(但不总是),当在字典理解中使用时,迭代器的
\uuuuu next\uuuu()
方法将返回两个元素。至少有一个元素必须是可散列的,以便可以将其用作字典键

iterator
不一定需要返回两个元素(尽管这是一种常用模式):

还表明字典理解实际上只是特殊语法,使用与列表理解相同的机制和
dict()
方法,这就是@Barmar的注释所做的:

frames = dict(data.groupby('Sport'))
在本例中,
data.groupby()
确实需要返回两个元素,并且顺序确实很重要,因为它是(大致)以下内容的缩写:


globals()。调用
data.groupby()
将返回一对值,称为
i
dat
,符号
{i:dat for i,dat in…}
将所有这类对作为键和
dat
作为值,用
i
构建一个新字典。您也可以将其写成
frames=dict(data.groupby(“运动”)
@Z4 tier可能有一个规范的dup解释了什么是字典理解,但我的列表中没有。你有吗?@Barmar我找不到。很多问题都涉及字典理解,但我找不到解释它是什么的东西。我会发布一个答案,也许其他人会过来链接。感谢您的回复!现在我理解了字典理解背后的逻辑。最后一个疑问。示例中的数据框“frame”有两列(“Sport”和“random_data”)。如果有另一列“player”,那么dataframe“frame”有3列。如果我想创建一个dictionAnry压缩来只调用列“Sport”和“player”,dict压缩中的语法是什么?我尝试了以下方法,但不起作用:“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')}对于sport,sport_stats in data.groupby('sport')}
返回类似
('sport',DataFrame)的对
,内部理解将解压第一个数据帧(我称之为sport_stats),这一次按玩家分组,因此您将得到
(sport,(player,player_数据帧))
。这是一个很好的示例,说明了为什么使用有意义的名称而不是单个字母是很好的:)
print(dict([(i, chr(65+i)) for i in range(4)]))
{0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}
frames = dict(data.groupby('Sport'))
dict([(key, value) for key, value in data.groupby('Sport')])