我可以帮您翻译成中文:我能否使用一个变量字符串来引用列表?

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不将我提供的内容视为字符串,而是作为对列表的引用?


10
把那些列表放进一个字典里可能是个好主意,而且这样也可以解决你的问题。 - Waleed Khan
@arxanas 把它作为一个答案发布。 - Hans Z
好的,我会尝试翻译。谢谢。@arxanas 我会测试一下,但如果你想把这个作为答案,我在它能够工作时会接受它。 - Lostsoul
6个回答

10
为什么不将你当前的列表作为一个字典来存储呢?
与其这样写:
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]


4

将逐日的值移入字典中:

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

然后像这样查找它们:
stock_values[ stock ][ days ]

2

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]

现在你会在 value[days] 上得到一个异常 - value 是一个整数。 - Izkata

1

只是出于好奇:

#!/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

Python是一种编程语言,你绝对应该听从本杰明大叔的建议...

伟大的力量带来伟大的责任

:-)


1
如果你能将Python与蜘蛛侠联系起来,那么我会给你加1分。如果你还能将它与黑暗骑士联系起来,那么我会再加2分。 - Lostsoul

1
你遇到的问题是因为你在脚本中将股票名称既用作字符串值,又用作变量名称。这样做会引起许多其他问题,但是这里有一个简单的解决方法:
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只是另一个名称,用于表示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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接