Python 3,列表推导,范围以及如何与外部变量进行比较

时间:2015-03-27 09:10:29

标签: python python-3.x list-comprehension

我有一个代表库存物品及其价值的类:

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

1 个答案:

答案 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