代码之家  ›  专栏  ›  技术社区  ›  Tom Huntington

返回突变列表的表达式

  •  1
  • Tom Huntington  · 技术社区  · 1 年前

    我正在寻找一个单独的表达式,对一个元素进行变异并返回修改后的列表

    以下内容有点冗长

    # key=0; value=3; rng=[1,2]
    [(v if i != key else value) for i, v in enumerate(rng)]
    

    编辑 :

    我正在寻找一种在单个表达式中内联以下函数的方法

    def replace(rng: List, key: int, value):
        a = list(rng) 
        a[key] = value
        return a
    

    编辑2 :真正激发这个问题的代码

    class TextDecoder(nn.Module):
        def forward(self, x: Tensor, kv_cache: Tensor):
            kv_cache_write = torch.zeros((_:=list(kv_cache.shape))).__setitem__(-2, x.shape[-1]) or _)
            ...
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   Kelly Bundy    1 年前

    也许比列表串联更好:

    [*rng[:key], value, *rng[key+1:]]
    

    另一个

    [a for a, a[key] in [(rng[:], value)]][0]
    

    或者,如果您只是将结果分配给一个变量(如前所述),您可以执行以下操作:

    a, a[key] = rng[:], value
    
        2
  •  1
  •   Michael M.    1 年前

    尝试列表串联:

    key = 0
    value = 3
    rng = [1, 2]
    
    out = rng[:key] + [value] + rng[key+1:]
    print(out)
    

    rng[:key] 是直到密钥的列表的副本(排他), [value] 是唯一元素所在的新列表 value rng[key+1] 是上的密钥的列表副本(独占)。将这些连接在一起,就会得到一个替换密钥的副本。

        3
  •  0
  •   Tom Huntington    1 年前
    # key=0; value=3; rng=[1,2]
    print(rng.__setitem__(key, value) or rng)
    

    如果不想修改原始列表 rng ,你可以

    print((_:=list(rng)).__setitem__(key, value) or _)
    

    不幸的是,这会泄露变量 _ .