【问题标题】:Replacing every other position in a list替换列表中的所有其他位置
【发布时间】:2026-02-16 00:50:01
【问题描述】:

我正在尝试制作一些东西,让我可以用单个项目替换列表中的所有其他位置:

l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = "A"
print(l)

我期待这样的事情:

["A", 1, "A," 3, "A", 5, "A", 7, "A", 9, "A"]

我尝试了索引[::] 的不同位置,但要么得到错误,要么得到的结果不包括列表的其余部分。

相反,我得到了这个:

ValueError: attempt to assign sequence of size 1 to extended slice of size 2

【问题讨论】:

  • l[::2] = ['A']*(len(l)//2) 会做到的。 numpy 可以进行广播,但 Python 要求列表大小相同。
  • 为什么会从奇数元素切换到偶数元素?
  • 我猜你的预期输出是 ['A', 1, 'A', 3, 'A', 5, 'A', 7, 'A', 9, 'A']。 l[::2] = ["A"] * math.ceil(len(l)/2)
  • @Barmar 开关是一个错字另外,谢谢你们的帮助!

标签: python list indexing


【解决方案1】:

切片是正确的,但您需要提供一个包含足够元素的序列来填充所有元素。

l[::2] = ["A"] * math.ceil(len(l)/2)

【讨论】:

    【解决方案2】:

    编辑:Barmar 的答案要好得多,只要您可以导入数学库。

    10,000 次循环的粗略速度比较(假设您不将列表变成生成器,否则列表理解总体上会稍微快一些):

    import math, time
    
    def slicing(n):
        for _ in range(n):
            l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
            l[::2] = ["A"] * math.ceil(len(l)/2)
    
    def comprehension(n):
        for _ in range(n):
            l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
            l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]
    
    start = time.time()
    slicing(10000)
    print(f'Using slicing and math.ceil: {time.time() - start} seconds')
    
    start = time.time()
    comprehension(10000)
    print(f'Using list comprehension:    {time.time() - start} seconds')
    
    >>> Using slicing and math.ceil: 0.004003286361694336 seconds
    >>> Using list comprehension:    0.012019157409667969 seconds
    

    编辑#2:对于任何想知道的人来说,Alain 的回答平均每 10,000 次循环大约需要 0.0075 秒,所以基本上就在中间。


    旧答案:尝试使用与enumerate 配对的列表推导:

    l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]
    

    这会将每个元素替换为奇数索引(奇数 %2 将等于 0)和字母“A”,其余元素保持原样。 Enumerate 循环遍历原始的可迭代对象,但也包含一个索引元素。

    【讨论】:

      【解决方案3】:

      您必须提供与要分配的项目一样多的元素:

      l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      
      l[::2] = ("A" for _ in l[::2])
      
      print(l)
      ['A', 1, 'A', 3, 'A', 5, 'A', 7, 'A', 9, 'A']
      

      或者这样:

      l[::2] = ["A"]*len(range(0,len(l),2))
      

      【讨论】:

        最近更新 更多