使用字典而不是 globals()

Using Dictionaries instead of globals()

我正在做一个关于检索股票信息的商业案例。老师使用下面的代码创建了带有股票信息的DataFrames。

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

我的问题是我不明白答案中的这行代码:

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

谁能解释一下?

在这种情况下,frames 是使用 词典理解 构建的词典。调用 data.groupby() 是 returning 一对值,在理解中被称为 idat,而符号 {i:dat for i, dat in ...} 正在构建一个新的使用 i 作为键,使用 dat 作为值,从所有这些对中提取字典。结果存储在frames.

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

{key: value for key, value in iterator}

this question 的答案很好地解释了 python 中的迭代器是什么。通常(但不总是),当用于字典理解时,迭代器的 __next__() 方法将 return 两个元素。至少有一个元素必须是可散列的,以便它可以用作字典键。

iterator 不一定需要 return 两个元素(尽管这是一种常见的使用模式)。 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() 需要 return 两个元素,顺序 很重要,因为它是 shorthand(大致)这个:

dict([(key, value) for key, value in data.groupby('Sport')])