【问题标题】:Replace a list slice with a packed tuple用打包元组替换列表切片
【发布时间】:2015-08-04 15:44:11
【问题描述】:

我有一个元组形式的点列表:

myList = [(1,1), (2,2), (3,3), (4,4), (5,5)]

我想用一个新的元组(6,6) 替换一个可变长度的切片,所以结果是这样的:

myList = [(1,1), (6,6), (5,5)]

我尝试将元组分配给切片,但这会解包元组。

startIndex = 1
endIndex = 3
newTuple = (6,6)
myList[startIndex:endIndex] = newTuple
#myList == [(1, 1), 6, 6, (4, 4), (5, 5)]

我目前的方法如下,但我想知道是否有办法绕过这种自动解包,以及是否有更好或更易读的方法来做到这一点。

myList[startIndex] = newTuple
del myList[startIndex+1:endIndex]

【问题讨论】:

  • myList[startIndex:endIndex] = [newTuple] 怎么样?

标签: python list tuples slice


【解决方案1】:

您需要将您的元组(一个值)包装在一个列表中:

myList[startIndex:endIndex] = [newTuple]

切片赋值总是遍历右侧对象;您正在将一个索引列表替换为另一个。

来自赋值语句文档:

最后,要求序列对象将切片替换为指定序列的项目。如果对象允许,切片的长度可能与指定序列的长度不同,从而改变目标序列的长度。

由于您提供了一个普通元组,因此元组中的元素用于替换切片索引。通过将它包装在一个列表中,您的元组是该列表中的一个元素,并且它本身不会被进一步解包:

>>> myList = [(1,1), (2,2), (3,3), (4,4), (5,5)]
>>> startIndex = 1
>>> endIndex = 3
>>> newTuple = (6,6)
>>> myList[startIndex:endIndex] = [newTuple]
>>> myList
[(1, 1), (6, 6), (4, 4), (5, 5)]

【讨论】:

    【解决方案2】:
    >>> myList = [(1,1), (2,2), (3,3), (4,4), (5,5)]
    >>> myList[1:4] = [(6,6)]
    >>> myList
    [(1, 1), (6, 6), (5, 5)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 2023-04-06
      • 2018-11-21
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      相关资源
      最近更新 更多