【问题标题】:list extend() to index, inserting list elements not only to the endlist extend() 索引,不仅将列表元素插入到末尾
【发布时间】:2011-11-14 14:48:25
【问题描述】:

我正在寻找最 Pythonic 的方式来实现列表 extend 函数的一个版本,它延伸到给定索引而不是列表末尾。

a_list = [ "I", "rad", "list" ]                                                       
b_list = [ "am", "a" ]
a_list.my_extend( b_list, 1 ) # insert the items from b_list into a_list at index 1

print( a_list ) # would output: ['I', 'am', 'a', 'rad', 'list']

有没有办法在不建立新列表的情况下做到这一点,像这样?

a_list = [ "I", "rad", "list" ]
b_list = [ "am", "a" ]
c_list = []

c_list.extend( a_list[:1] )
c_list.extend( b_list     )
c_list.extend( a_list[1:] )

print( c_list ) # outputs: ['I', 'am', 'a', 'rad', 'list']

这种方法实际上并没有那么糟糕,但我有一种预感,它可能会更容易。可以吗?

【问题讨论】:

  • 建立一个新列表没有错,但你为什么要分步进行呢?比这简单得多:c_list = a_list[:1] + b_list + a_list[1:].
  • 我不知道 + 对于列表来说是超载的。
  • 我需要同样的东西,但几乎要问,相反,要让insert 以类似extend 的方式在索引处添加“解包”列表元素...答案是一样的:-D

标签: python list insert


【解决方案1】:

当然,您可以使用切片索引:

a_list[1:1] = b_list

为了演示一般算法,如果您要在假设的自定义 list 类中实现 my_extend 函数,它看起来像这样:

def my_extend(self, other_list, index):
    self[index:index] = other_list

但实际上不要让它成为一个函数,只需在需要时使用切片符号即可。

【讨论】:

  • 哈,我就知道!我从没想过要尝试。我只是假设它将整个b_list 放入索引1 处的a_list,而不是b_list 的元素。我显然需要回顾一下切片的复杂性。非常感谢。
  • 虽然我喜欢这个解决方案,但我猜它有点违反 Python 原则,因为它不是很明显会发生什么(不是你的错)。我希望有可选的参数来扩展而不是......
  • 我不知道,我认为一旦你习惯了切片符号,它就足够明显了。希望the_list[i:j] = other_listi < j 有意义,这是j - i 从上方接近零时发生的自然限制。现在,如果我们谈论的是i > j(如the_list[5:3] = other_list)的情况,那么我肯定会同意,直观上应该发生什么并不明显,但我认为该语法无论如何都不起作用。
  • @DavidZaslavsky list[i:j] = list2 确实适用于i > j,但它只是在索引i 处插入list2 的项目。没有项目被删除或“覆盖”。
  • @JerryMa 在您的示例中,i < j。我只说i > j 插入但不覆盖。例如:a=[1, 2, 3]a[2:1]=[4, 5] 将给出 [1, 2, 4, 5, 3]
猜你喜欢
  • 2023-03-17
  • 2023-04-03
  • 2013-10-30
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2019-04-25
相关资源
最近更新 更多