一位 friend 给我发了一个 Jupyter 笔记本,其中包含以下代码:
for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]):
stock_df['Allocation'] = stock_df['NormedReturn']*allo
我理解输出,因为它在每个数据帧“aapl”、“cisco”中创建一个新列“分配”...并将权重应用于规范返回。但是,我对语法的理解还不够,我可以自己再做一遍。
这个 for 循环在 2 个元素和 zip 上如何工作? (我认为压缩时元素的长度必须相似,否则输出数据将被截断)。
最佳答案
这里 Python 语法的关键位是 zip()
功能。
从文档中,我们可以看到:
Returns an iterator of
tuples
, where thei-th
tuple contains thei-th
element from each of the argument sequences oriterables
.
因此它传递了可迭代对象并将它们“压缩”在一起。通过一个例子可能会更容易理解:
>>> a = [1, 2, 3, 4]
>>> b = [9, 8, 7, 6]
>>> list(zip(a, b))
[(1, 9), (2, 8), (3, 7), (4, 6)]
<小时/>
因此,在您的代码中,这与称为“元组解包”的方法一起使用,该方法只是执行以下操作:
>>> i, j = 5, 6
>>> i
5
>>> j
6
这允许干净的代码迭代从 zip()
返回的元组。如果您仍然不确定循环在做什么,我们可以修改它以print
变量(为简单起见,我还将传递到zip
的变量转换为字符串):
for stock_df, allo in zip(('aapl', 'cisco', 'ibm', 'amzn'), [.3,.2,.4,.1]):
print(stock_df, allo)
您可以从输出中看到我们所期望的结果:
aapl 0.3
cisco 0.2
ibm 0.4
amzn 0.1
我希望这可以帮助您清除代码,从您提出问题的方式看来,您已经知道这些变量实际上是如何在循环中处理的,所以我不会详细介绍。
关于python - 包含 2 个元素和一个 zip 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963519/