重载列表理解行为?

时间:2010-08-25 20:28:08

标签: python list overloading list-comprehension

我的任务是创建一个硬件笼的模型。每个网箱包含 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技能已经开始崩溃了。)

有人能提出更好的方法吗?

4 个答案:

答案 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()即可获得商家信息。