代码之家  ›  专栏  ›  技术社区  ›  JS.

重载列表理解行为?

  •  1
  • JS.  · 技术社区  · 14 年前

    我的任务是创建一个硬件框架模型。每个笼子都包含 n 插槽,每个插槽可能包含或不包含卡。

    我想用一个列表来模拟笼子。每个列表索引将对应于槽号。 cards[0].name="Card 0" 等。

    这将允许我的用户通过简单的列表理解来查询模型。例如:

    for card in cards:
        print card.name
    

    我的用户不是成熟的python用户,他们将与模型进行实时交互,因此列表索引与填充的卡不对应是不现实的。换句话说,如果用户删除了一张卡,我需要做一些事情来表明该卡没有被填充,我的第一个冲动是将列表项设置为 None .

    老板喜欢这个计划,但如果有卡丢失,他不会为上面的清单理解失败而疯狂。他甚至不支持要求用户学习足够的python来创建将忽略的列表理解表达式。 没有 .

    我的想法是把 list 类,以创建 newclass . 它的工作方式与列表完全相同,除了 for card in cards 只返回未设置为的成员 没有 .

    是否有人演示如何重载列表类,以便子类上调用的列表理解将忽略 没有 ?(当我尝试这个的时候,我的python技能已经开始崩溃了。)

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

    4 回复  |  直到 13 年前
        1
  •  8
  •   John La Rooy    14 年前
    >>> 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']
    
        2
  •  2
  •   kindall    14 年前

    您可以为此提供一个生成器/迭代器。

    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
    
        3
  •  1
  •   g.d.d.c    14 年前

    如果您使用的是2.6或更高版本,您可以这样做来获取名称:

    names = [x.name for x in cards if x is not None]
    

    这应该接近你想要的。

        4
  •  0
  •   unutbu    14 年前

    也许定义一个函数(假设卡片是一个全局变量???):

    def pcards():
        for card in cards:
            if card:
                print card.name
    

    这样用户就可以简单地输入 pcards() 得到一个清单。