我正在制作一个拥有玩家库存系统的游戏,而库存是一个有限大小为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)
答案 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
等于1
且False
等于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