在定义列表的时候,有条件的向列表中添加项目吗?

问题描述 投票:6回答:3

有没有一种方法可以在定义列表的时候,有条件地将项目添加到列表中?

l = [
    Obj(1),
    Obj(2),
    Separator() if USE_SEPARATORS,
    Obj(3),
    Obj(4),
    Obj(5),
    Separator() if USE_SEPARATORS,
    Obj(6)
]

很明显上面的代码不能用,但有没有类似的方法?

目前我有

l = [item for item in (
        Obj(1),
        Obj(2),
        Separator() if USE_SEPARATORS,
        Obj(3),
        Obj(4),
        Obj(5),
        Separator() if USE_SEPARATORS,
        Obj(6)
) if not isinstance(item, Separator) or USE_SEPARATORS]

但我想知道是否有其他方法不需要在列表中循环,因为它们可能有10000个项目长,而且当我执行代码时,服务器会停止四分之一秒左右.这是一个第一人称射击游戏,所以四分之一秒实际上可能会对某人的死亡或生活产生影响。

python list python-3.x list-comprehension
3个回答
4
投票

我会直接插入它们 之后;毕竟列表是可以改变的。

l = [
    HeadObj(1),
    HeadObj(2),
    BodyObj(1),
    BodyObj(2),
    BodyObj(3),
    FooterObj(1)
]
if USE_SEPARATORS:
    l.insert(2, Separator())
    l.insert(6, Separator())

1
投票

我会添加分隔符,如果不需要的话,我会删除它们。

l = [
    Obj(1),
    Obj(2),
    Separator(),
    Obj(3),
    Obj(4),
    Obj(5),
    Separator(),
    Obj(6)]

if not USE_SEPARATORS:
    l = [object for object in l if not isinstance(object, Separator)]

0
投票

另一种方法是使用spatunpacking操作符。

possible_separator = (Separator(),) if USE_SEPARATORS else ()
l = [
    Obj(1),
    Obj(2),
    *possible_separator,
    Obj(3),
    Obj(4),
    Obj(5),
    *possible_separator,
    Obj(6)
]
© www.soinside.com 2019 - 2024. All rights reserved.