Python 定义列表时是否有条件地向列表中添加项?

Python 定义列表时是否有条件地向列表中添加项?,python,list,python-3.x,list-comprehension,Python,List,Python 3.x,List Comprehension,在定义列表时,是否有方法有条件地将项目添加到列表中? 我的意思是: 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),

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

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个条目,当我执行代码时,服务器会停止大约四分之一秒。 这是一款第一人称射击游戏,所以四分之一秒可能会对死亡或活着的人产生影响;列表毕竟是可变的:

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

如果不需要,我会添加分隔符并移除它们:

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)]

另一种方法是使用splat/unpacking操作符将元素展开为分隔符或无:

如果使用分隔符,则可能的分隔符=(分隔符(),)
l=[
Obj(1),
Obj(2),
*可能的_分隔符,
Obj(3),
Obj(4),
Obj(5),
*可能的_分隔符,
Obj(6)
]

为什么在运行时在函数中定义这些列表(它们看起来是静态的)?为什么不在需要时查找常量?@MartijnPieters
Obj
实例实际上要复杂得多,它们因调用函数的玩家而异,因此需要为加入服务器的每个玩家创建它们。我实际上在考虑一种不同的解决方案,而不是使用带分隔符的列表(可能是一个有序的列表),但我想到了这一点,感到好奇,想知道一个好的解决方案,如果我需要的话。所以基本上我问的只是为了学习:)我怎么没有想到这个:虽然列表是用for循环创建的,因为它们可能非常长,但我想我可以创建一个算法来自动添加分隔符!有没有一种方法可以对匿名列表执行此操作,例如,作为更大列表中的元素的列表,在创建后不命名列表,也不访问更大的列表?弄明白了,对于结尾追加(我的用例),我们可以使用,例如,
[1,2,3]+([4,5]if condition else[])
只有在使用分离器的情况下,速度才会明显加快,如果不使用分离器,则不会产生太大的影响,只需进行if检查即可