库存功能的列表理解非常简单

时间:2014-08-14 11:56:08

标签: python list list-comprehension

我正在制作一个拥有玩家库存系统的游戏,而库存是一个有限大小为5的列表。我通过保持列表总是5个索引长来限制库存的大小,并填充空白区域没有类型。

我想知道是否有更简单的方法来查找列表的长度,排除其中所有类型。我猜测这可以通过我在下面完成的列表组合更简单地完成:

Inventory = [1, 2, None, None, 5, None]
items = [i for i in range(len(Inventory)) if Inventory[i] is not None
itemCount = len(items)

6 个答案:

答案 0 :(得分:2)

>>> Inventory = [1, 2, None, None, 5, None]

使用列表comp

>>> len([i for i in Inventory if i is not None])
3

使用filter

>>> len(filter(lambda i : i is not None, Inventory))
3

filter的工作方式是,它需要一个函数和一个列表,并根据函数删除内容。所以我可以做一个像这样的功能

def checkIfNotNone(item):
    return item is not None

然后我可以使用filter制作以下列表。

filter(checkIfNotNone, Inventory)
[1, 2, 5]

现在我可以查看len,它将是3。我做了同样的事情,但不是使用def编写函数,而是使用了lambda表达式,这基本上是一个匿名函数,我只打算在该上下文中使用。

答案 1 :(得分:2)

这会使库存中的项目列表的长度不为:

len([item for item in Inventory if item is not None])

这只是计算None发生的频率,然后从固定长度中减去它:

5 - Inventory.count(None)

答案 2 :(得分:1)

>>> Inventory = [1, 2, None, None, 5, None]
>>> len(filter(None, Inventory))
3

答案 3 :(得分:0)

计算None并从总长度中减去它:

>>> Inventory = [1, 2, None, None, 5, None]
>>> len(Inventory)-Inventory.count(None)
3

答案 4 :(得分:0)

到目前为止,有几个答案经常使用len(filter(...))而不能在Python 3中工作,因为filter现在返回一个生成器,而不是列表。适用于所有Python版本的替代方法是:

sum(x is not None for x in Inventory)

这利用了True等于1False等于0的事实。

但如果您只有一种无效值(例如None),那么RemcoGerlich建议的解决方案可能是最快的:

len(Inventory) - Inventory.count(None)

这应该很快,因为list.count是在C中实现的,因此循环中没有运行Python代码(因为会有任何列表推导或生成器表达式)。

答案 5 :(得分:0)

In [1]: inventory = [1, 2, None, None, 5, None]

In [2]: sum(map(bool, inventory))
Out[2]: 3