代码之家  ›  专栏  ›  技术社区  ›  meallhour

用iterable替换slice

  •  0
  • meallhour  · 技术社区  · 3 年前

    我有一张单子 s 如下所示:

    s = [1, 2, 3]
    

    我要替换 slice of 's' 使用以下代码:

    s[1:4] = [22, 3, 4, 5, 6, 7]
    print(s)
    

    输出: [1, 22, 3, 4, 5, 6, 7]

    我的理解 s[1:4] 只应更换 3 elements starting from 1st element up to but not including 4th element.

    假设产出: [1, 22, 3, 4]

    2 回复  |  直到 3 年前
        1
  •  5
  •   DollarAkshay    3 年前

    让我们用一个更好的例子。我已经将输出作为注释掉的代码包含在代码片段中

    s = list(range(1, 11))
    print(f"Len = {len(s)} | S = {s}")
    
    # Len = 10 | S = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    有三种情况:

    案例1:分配的列表短于索引范围

    s = list(range(1, 11))
    s[1:4] = [0, 0]
    print(f"Len = {len(s)} | S = {s}")
    
    # Len = 9 | S = [1, 0, 0, 5, 6, 7, 8, 9, 10]
    

    答案: 列表大小缩小了1,因为只有2个项目被分配到3个位置。

    案例2:分配的列表长于索引范围

    s = list(range(1, 11))
    s[1:4] = [0, 0, 0, 0, 0, 0, 0]
    print(f"Len = {len(s)} | S = {s}")
    
    # Len = 14 | S = [1, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10]
    

    答案: 由于7个项目被分配到3个位置,列表大小增加了4个。

    案例3:指定列表等于索引范围

    s = list(range(1, 11))
    s[1:4] = [0, 0, 0]
    print(f"Len = {len(s)} | S = {s}")
    
    # Len = 10 | S = [1, 0, 0, 0, 5, 6, 7, 8, 9, 10]
    

    答案: 在这种情况下,由于两种尺寸匹配,因此将正确更换。

    结论

    • Python似乎正在缩小和增加列表,以容纳指定的项。
    • 无论分配的列表有多大/多小,切片索引之外的所有元素都不会受到影响。
        2
  •  1
  •   Sajjad Zaidi    3 年前
    s = [1,2,3]
    x = [22,3,4,5,6]
    j = 0
    for i in range(1,4):
        try:
            s[i] = x[j]
        except IndexError:
            s.append(x[j])
        j +=1
    

    你可以用这样的方法来实现你的目标