当前位置: 首页 > 知识库问答 >
问题:

在列表中的特定索引处插入元素并返回更新后的列表

晏经武
2023-03-14

我有这个:

>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]

>>> print a.insert(2, 3)
None

>>> print a
[1, 2, 3, 4]

>>> b = a.insert(3, 6)
>>> print b
None

>>> print a
[1, 2, 3, 6, 4]

有没有办法可以得到更新后的列表,而不是就地更新原始列表?

共有3个答案

宗弘扬
2023-03-14

我得到的最短的: b = a[:2] [3] a[2:]

>>>
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]
周滨海
2023-03-14

还可以使用列表中的切片索引插入元素。例如:

>>> a = [1, 2, 4]
>>> insert_at = 2  # Index at which you want to insert item

>>> b = a[:]   # Created copy of list "a" as "b".
               # Skip this step if you are ok with modifying the original list

>>> b[insert_at:insert_at] = [3]  # Insert "3" within "b"
>>> b
[1, 2, 3, 4]

要将多个元素一起插入给定索引,您需要做的就是使用要插入的多个元素的list。例如:

>>> a = [1, 2, 4]
>>> insert_at = 2   # Index starting from which multiple elements will be inserted

# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]

>>> a[insert_at:insert_at] = insert_elements
>>> a   # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]

要了解有关切片索引的更多信息,可以参考:了解切片表示法。

注意:在Python 3.x中,片索引和< code>list.index(...)显著降低,两者几乎相当。但是,在Python 2.x中,这种差异相当明显。我在这个回答的后面分享了性能比较。

使用列表理解的替代方法(但在性能方面非常慢):

作为替代方案,也可以使用带有enumerate的列表理解来实现。(但请不要这样做。这只是为了说明):

>>> a = [1, 2, 4]
>>> insert_at = 2

>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]

以下是所有答案与Python 3.9.1和Python 2.7.16上的1000个元素列表的timeit比较。答案按两个Python版本的性能顺序列出。

>

  • 我的答案使用切片插入 - 最快(每个循环2.25微秒)

    python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
    100000 loops, best of 5: 2.25 µsec per loop
    

    Rushy Panchal使用list.insert(…)-第二(每循环2.33µsec)

    python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
    100000 loops, best of 5: 2.33 µsec per loop
    

    ATOzTOA基于切片列表合并的公认答案-第三个(每个循环5.01微秒)

    python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
    50000 loops, best of 5: 5.01 µsec per loop
    

    我用List理解和枚举的答案-第四(非常慢,每循环135µsec)

    python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
    2000 loops, best of 5: 135 µsec per loop
    

    > < li>

    我使用切片插入的答案-最快(每次循环2.09秒)

    python -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
    100000 loops, best of 3: 2.09 µsec per loop
    

    Rushy Panchal使用list.insert(…)-第二(每循环2.36µsec)

    python -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
    100000 loops, best of 3: 2.36 µsec per loop
    

    ATOzTOA基于合并切片列表的公认答案-第三个(每个循环4.44μsec)

    python -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
    100000 loops, best of 3: 4.44 µsec per loop
    

    我的答案是列表理解和枚举

    python -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
    10000 loops, best of 3: 103 µsec per loop
    

  • 赫连靖琪
    2023-03-14

    <代码>l。insert(index,obj)实际上没有返回任何内容。它只是更新列表。

    正如ATO所说,你可以做 b = a[:索引] [obj] a[索引:]。但是,另一种方法是:

    a = [1, 2, 4]
    b = a[:]
    b.insert(2, 3)
    
     类似资料:
    • 问题内容: 我有这个: 有没有一种方法可以获取更新的列表作为结果,而不是就地更新原始列表? 问题答案: 我得到的最短信息:

    • 如何将项目插入到特定索引的列表中?不使用: 帮助!

    • 我正在尝试编写一种方法,删除每组4个元素中的第一个、第二个和第三个元素。它似乎根本不起作用。有人能帮忙吗?

    • 我试图找出在单行中删除索引处的指定元素后是否有可能返回更新的ArrayList,以便将其传递给递归函数。下面是我的代码片段,它试图在给定n对“()”括号的情况下生成所有有效的括号组合。 我关心的是递归函数调用“findAllCombinations”,其中经过一些验证后,我希望在每次递归调用时从arrayList库集中删除一个字符。然而,源集。remove(index)返回一个字符。相反,我希望在

    • 问题内容: 是否可以在Redis列表中的特定索引处删除元素?没有真正找到我想要的。有修剪可以让您选择一组特定的元素,LREM可以让您按值删除列表中的项目,但是我没有值。 我发现了一个黑客,您在其中使用LSET将元素的值更改为UID或字符串,例如“ DELETED”,然后您对该值调用LREM。不过,这感觉有点脏。 问题答案: 因此,完成我想要的操作的唯一方法是将索引处的值设置为预定字符串,然后按值进

    • 问题内容: 我可以在熊猫的特定列索引处插入列吗? 这会将列作为的最后一列,但是没有办法告诉它放在开始处吗? 问题答案: 参见文档:http : //pandas.pydata.org/pandas- docs/stable/genic/pandas.DataFrame.insert.html 使用loc = 0将在开头插入