我有一个代表库存物品及其价值的类:
class stock:
def __init__(self, stockName, stockType, value):
self.name = stockName
self.type = stockType
self.value = value
我有很多库存,因此我列出了库存对象,我可以从中查看单个商品的价值,例如stockList[12].value
我想将所有库存商品的价值加起来作为衬衫'。以下工作正常:
shirtValue = sum([s.value for s in stockList if s.value == 'shirt'])
好的,好的。但现在我有一个stockType
列表,并希望将与stockType列表中特定条目匹配的项目的值相加,例如:
stockTypeValue[0] = sum([s.value for s in stockList if s.value == stockType[0]])
其中stockType[0] = 'shirt'
这不起作用。我知道为什么 - 这是因为在Python 3中,列表推导有自己的范围(详见答案:Accessing class variables from a list comprehension in the class definition)
我的问题是:我编写的代码,我认为在Python 2中可以使用,看起来很棒,干净,易于理解,未经训练的眼睛看起来非常pythonic。
但是我无法弄清楚如何在Python 3中以一种漂亮的pythonic方式做同样的事情。我将回到大循环结构。
在Python 3中执行此操作的最佳方法是什么?
*编辑* 错误讯息:
这是我想要做的一个例子:
stockList=[]
stockList.append(stock('product A', 'shirt', 53.2))
stockList.append(stock('product B', 'hat', 20.2))
sum([s.value for s in stockList if s.type=='shirt'])
输出:
Out[5]: 53.3
但如果我穿衬衫'变成一个变量:
stockType = 'shirt'
sum([s.value for s in stockList if s.type==stockType])
输出:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<console>", line 1, in <listcomp>
NameError: name 'stockType' is not defined
答案 0 :(得分:2)
这不起作用。我知道为什么 - 这是因为在Python 3中,列表推导有自己的范围(详见答案:Accessing class variables from a list comprehension in the class definition)
实际上并非如此。我的意思是,当然这个问题的答案是正确的,但这不是这里发生的事情。该问题仅与定义时在类体中发生的表达相关。如果你是虽然在一个方法中没有任何问题。
然而,可能失败的原因(“可能”因为您没有提供错误消息)是目标列表stockTypeValue
未初始化。
>>> stockTypeValue[0] = 'something'
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
stockTypeValue[0] = 'something'
NameError: name 'stockTypeValue' is not defined
所以我们现在可以定义它并分配一个空列表;但列表仍然是空的:
>>> stockTypeValue = []
>>> stockTypeValue[0] = 'something'
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
stockTypeValue[0] = 'something'
IndexError: list assignment index out of range
相反,您必须将结果附加到空列表:
>>> stockTypeValue.append('something')
>>> stockTypeValue[0]
'something'
重播你的例子:
>>> stockList = []
>>> stockList.append(stock('product A', 'shirt', 53.2))
>>> stockList.append(stock('product B', 'hat', 20.2))
>>> sum([s.value for s in stockList if s.type == 'shirt'])
53.2
>>> stockType = 'shirt'
>>> sum([s.value for s in stockList if s.type == stockType])
53.2