3

我有一个字典中的股票价格列表和它们的值列表。我想浏览列表以获取每天股票的价值,但是当我使用变量访问数据时,我无法解析列表中的位置。

这是一个例子:

goog = [12,132,124,234,234]
msft = [432,23,234,54,23]

num_days = 5
stocks_i_own = {'goog':50, 'msft':50}

for days in range(0,num_days):
    for stock in stocks_i_own:
        print days, stock, stocks_i_own[stock]
        print stock[days] #prints just 'g' not the value on day0
        print 'vaue on ', days, ' is ', stock[days] *  stocks_i_own[stock]

问题是当我stock[days]用来获取数据时。我知道 stock 有正确的值('goog' 或 'msft'),days 有正确的值(范围为 0-4),但是当它们一起使用时,我没有从列表中获取数据,而是从关于这个词本身。这是有道理的,因为类似:

name = 'google'
name[0]

将返回 g(在我的情况下它正在执行)但是 python 有没有办法不看到我作为字符串提供的内容,而是对列表的引用?

4

6 回答 6

11

为什么不将当前列表存储为字典呢?

代替:

goog = [12, 132, 124, 234, 234]
msft = [432, 23, 234, 54, 23]

利用:

stock_vals = { 'goog': [12, 132, 124, 234, 234], 'msft': [432, 23, 234, 54, 23] }

现在您可以使用以下方法检索它们:

stock_vals[stock_name][day_index]

其中 stock_name 是 的一个元素,{'goog', 'msft', ...}而 day_index 是 的一个元素[0, 6]

于 2012-07-20T19:42:56.280 回答
5

将每日值移动到字典中:

stock_values = { 'goog': [12,132,124,234,234],
                 'msft': [432,23,234,54,23] }

然后像这样查找它们:

stock_values[ stock ][ days ]
于 2012-07-20T19:42:57.407 回答
2

将字符串转换为预先存在的变量名称- 您可以这样做,但不建议这样做。最好将 goog 和 msft 存储在字典中,其中键是字符串,值是列表。

于 2012-07-20T19:43:00.053 回答
2

您遇到的问题是因为您将股票名称用作字符串的值和脚本中变量的名称。以这种方式做事存在许多(其他)问题,但这里有一个简单的解决方法:

goog = [12,132,124,234,234]
msft = [432,23,234,54,23]

num_days = 5
stocks_i_own = {'goog':50, 'msft':50}

for day in range(num_days):
    for stock in stocks_i_own:
        print day, stock, stocks_i_own[stock]
        stock_prices = eval(stock) # get list of prices with this stock's name
        print stock_prices[day]
        print 'value on ', day, ' is ', stock_prices[day] *  stocks_i_own[stock]
        print

stock这通过 Python 的内置函数将给定字符串值的字符串名称转换为同名的当前变量的值,从而使事情起作用eval()。此函数以与 Python 解释器相同的方式评估它在字符串参数中传递的表达式并返回结果值。在这种情况下,表达式只是一个变量的名称,因此stock_prices只是成为 thegoogmsft变量的值的另一个名称。

一个稍微好一点的方法是创建另一个类似于stocks_i_own包含每个相应命名股票的每日价格列表的字典。这样,您将能够使用相同的键(stock变量中保存的股票的字符串名称)为每一个索引,以检索相应的数据。这是我的建议:

num_days = 5
stocks_i_own = {'goog':50, 'msft':50}
stock_prices = {'goog': [12,132,124,234,234],
                'msft': [432,23,234,54,23]}

for day in range(num_days):
    for stock in stocks_i_own:
        print day, stock, stocks_i_own[stock]
        daily_prices = stock_prices[stock]
        print daily_prices[day]
        print 'value on ', day, ' is ', daily_prices[day] *  stocks_i_own[stock]
        print

可以使用更长的表达式代替单独的daily_prices变量,但可能不那么容易理解。stock_prices[stock][day]

于 2012-07-20T21:26:43.633 回答
2

只是为了好奇:

#!/usr/bin/env python
goog = [12,132,124,234,234]
msft = [432,23,234,54,23]

num_days = 5
stocks_i_own = {'goog':50, 'msft':50}

for days in range(0,num_days):
    for stock_name in stocks_i_own: #simmilar stocks_i_own.keys()
    globals_bak = globals()
    for var_name, var_value in globals_bak.items():
        if var_name == stock_name:
            studied_stock = var_value
                print days, stock_name, studied_stock
                print studied_stock[days] #prints just 'g' not the value on day0
                print 'vaue on ', days, ' is ', studied_stock[days] *  stocks_i_own[stock_name]

我相信这会做你想做的事,但我肯定会把它们放在字典里!!. (我只是将其发布为您可以使用 Python 做什么的示例,这并不意味着您应该这样做)

内置函数globals()返回一个字典,其中包含当前模块中定义的全局值(查看:globals

另外,这部分有一个问题:

for stock in stocks_i_own:
    #[...]
    print stock[days] #prints just 'g' not the value on day0

是因为当您将字典作为 时for x in dict()x获取键的值(for x in {}就像说for x in {}.keys())所以在您的情况下,您将获得字符串“ goog ”和字符串“ msft ”(不是其中包含的值)并且您重新走线。

你或多或少这样做:

>>> a="goog"
>>> for i in range(0,5):
...     print a[i]
... 
g
o
o
g
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: string index out of range

Pyhton 是您绝对应该听本叔叔的语言之一......

拥有权利的同时也被赋予了重大的责任

:-)

于 2012-07-20T20:05:06.220 回答
1

实际上 Stocks_i_own 是一本字典

利用:

for days in range(0,num_days):
    for stock, value in stocks_i_own.items():
        print days, stock, value
        print value[days] #prints just 'g' not the value on day0
        print 'vaue on ', days, ' is ', stock[days] *  stocks_i_own[stock]
于 2012-07-20T19:43:07.327 回答