定义列表时是否有条件地将项目添加到列表中?

Mar*_*nen 9 python list-comprehension list python-3.x

在定义列表时,有没有办法有条件地将项目添加到列表中?这就是我的意思:

l = [
    Obj(1),
    Obj(2),
    Separator() if USE_SEPARATORS,
    Obj(3),
    Obj(4),
    Obj(5),
    Separator() if USE_SEPARATORS,
    Obj(6)
]
Run Code Online (Sandbox Code Playgroud)

显然上面的代码不起作用,但是有类似的方法吗?

目前我有

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]
Run Code Online (Sandbox Code Playgroud)

但我想知道是否还有其他不需要循环遍历列表的方法,因为它们可能有 10 000 个项目长,并且当我执行代码时服务器会停止大约四分之一秒。这是一款第一人称射击游戏,所以四分之一秒实际上可能会对某个人的死或生产生影响。

jam*_*lin 15

另一种方法是使用 splat/unpacking 运算符将元素展开为分隔符或不展开:

possible_separator = (Separator(),) if USE_SEPARATORS else ()
l = [
    Obj(1),
    Obj(2),
    *possible_separator,
    Obj(3),
    Obj(4),
    Obj(5),
    *possible_separator,
    Obj(6)
]
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

我只是稍后插入它们;毕竟列表是可变的:

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

  • 想通了,为了在末尾追加(我的用例),我们可以使用,例如“[1, 2, 3] + ([4, 5] if condition else [])” (2认同)