【问题标题】:Overloading List Comprehension Behavior?重载列表理解行为?
【发布时间】:2010-08-25 20:28:07
【问题描述】:

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

谁能提出更好的方法?

【问题讨论】:

  • 你能描述一下你的“卡片”吗?它们是字典吗?类实例?

标签: python list overloading list-comprehension


【解决方案1】:
>>> 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】:

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

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 中的 Q-36
  • 非常正确,我提供的内容无法做到这一点,所以我删除了它。你需要一个替换的枚举函数。我将把它作为练习留给读者。 :-)
  • card==None != not card
【解决方案3】:

如果您使用的是 2.6 或更高版本,您可以执行以下操作来获取名称:

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

这应该接近你的想法。

【讨论】:

    【解决方案4】:

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

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

    因此您的用户只需输入pcards() 即可获得列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多