我的任务是创建一个硬件笼的模型。每个网箱包含 N 个插槽,每个插槽可能包含或不包含卡。
我想使用列表对笼子进行建模。每个列表索引将对应于插槽号。 cards[0].name="Card 0"
等等。
这将允许我的用户通过简单的列表推导来查询模型。例如:
for card in cards:
print card.name
我的用户(不是复杂的Python用户)将实时与模型进行交互,因此使列表索引与填充的卡不对应是不切实际的。换句话说,如果用户删除卡片,我需要做一些表明卡片未填充的内容 - 我的第一个冲动是将列表项设置为None
。
Bossman喜欢这个计划,但是如果有一张牌丢失,他并不会对上面的列表理解感到失望。 (它目前正在做什么。)他更不支持要求用户学习足够的Python来创建忽略None
的列表理解表达式。
我的想法是对list
类进行分类,以创建newclass
。除了for card in cards
只会返回未设置为None
的成员时,它的工作方式与列表完全相同。
有人请说明如何重载列表类,以便在子类上调用的列表推导会忽略None
吗? (到目前为止,当我尝试这种技能时,我的Python技能已经开始崩溃了。)
有人能提出更好的方法吗?
答案 0 :(得分:8)
>>> class MyList(list):
... def __iter__(self):
... return (x for x in list.__iter__(self) if x is not None)
...
>>>
>>> ml = MyList(["cat", "dog", None, "fox"])
>>> for item in ml:
... print item
...
cat
dog
fox
>>> [x for x in ml]
['cat', 'dog', 'fox']
>>> list(ml)
['cat', 'dog', 'fox']
答案 1 :(得分:2)
你可以为此提供一个生成器/迭代器。
def installed(cage):
for card in cage:
if card:
yield card
cards = ["Adaptec RAID", "Intel RAID", None, "Illudium Q-36 Explosive Space Modulator"]
# print list of cards
for card in installed(cards):
print card
答案 2 :(得分:1)
如果您使用的是2.6或更新版本,可以执行以下操作来获取名称:
names = [x.name for x in cards if x is not None]
这应该接近你的想法。
答案 3 :(得分:0)
也许定义一个函数(假设卡是一个全局变量?!?):
def pcards():
for card in cards:
if card:
print card.name
因此,您的用户只需输入pcards()
即可获得商家信息。