【问题标题】:Conditionally add items to a list when defining the list?定义列表时有条件地将项目添加到列表中?
【发布时间】:2015-05-06 20:47:58
【问题描述】:

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

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]

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

【问题讨论】:

  • 为什么要在函数运行时定义这些列表(它们看起来是静态的)?为什么需要时不查找常量?
  • @MartijnPieters Obj 实例实际上要复杂得多,它们因调用该函数的玩家而异,因此需要为每个加入服务器的玩家创建它们。实际上,我正在考虑一种与使用带有分隔符的列表(可能是列表的有序字典)不同的解决方案,但我想到了这一点并且很好奇并想知道一个好的解决方案,如果我需要它的话。所以基本上我只要求学习目的:)

标签: python list python-3.x list-comprehension


【解决方案1】:

另一种方法是使用 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)
]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我怎么没想到这个 :D 虽然列表是用 for 循环创建的,因为它们可能真的长,但我想我可以创建一个算法来自动添加分隔符!
    • 有没有办法对匿名列表执行此操作,例如,作为更大列表中的元素的列表,无需命名列表,也无需在创建后访问更大列表?
    • 想通了,我们可以在末尾附加(我的用例),例如,[1, 2, 3] + ([4, 5] if condition else [])
    【解决方案3】:

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

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

    【讨论】:

    • 只有在使用分隔符的情况下才会明显更快,如果不使用它们,它并没有太大的区别,只是 if 检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多