我可以使用变量字符串来引用列表吗?

时间:2012-07-20 19:38:16

标签: python arrays

我有一份字典中的股票价格清单及其价值清单。我想通过列表来获取每天股票的价值,但是当我使用变量访问数据时,我无法解析列表中的位置。

以下是一个例子:

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]来获取数据。我知道库存有正确的值('goog'或'msft'),天数有正确的值(范围为0-4),但是当它们一起使用时,我不会从列表中获取数据,而是获取位置关于这个词本身。这是有道理的,因为像:

name = 'google'
name[0]

将返回g(它在我的情况下做)但是有没有办法让python不要看到我将它作为字符串提供什么而是对列表的引用?

6 个答案:

答案 0 :(得分: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]

答案 1 :(得分:5)

将日常值移动到字典中:

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

然后像这样查看它们:

stock_values[ stock ][ days ]

答案 2 :(得分:2)

Convert a string to preexisting variable names - 您可以这样做,但不建议这样做。最好将goog和msft存储在字典中,其中键是字符串,值是列表。

答案 3 :(得分: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是你绝对应该听Ben叔叔的语言之一......

  

强大的力量带来了巨大的责任

<强>: - )

答案 4 :(得分: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

这可以通过Python的内置stock函数将给定eval()字符串值的字符串名称转换为同名当前变量的值来实现。此函数以与Python解释器相同的方式计算它在字符串参数中传递的表达式,并返回结果值。在这种情况下,表达式只是变量的名称,因此stock_prices只是googmsft变量的值的另一个名称。

更好的方法是创建另一个类似于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],但可能不是那么容易理解。

答案 5 :(得分: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]