【问题标题】:Replace sublist with different-length sublist in python, like string.replace在python中用不同长度的子列表替换子列表,如string.replace
【发布时间】:2021-07-11 02:22:05
【问题描述】:

我正在寻找类似 string.replace 的函数,但用于列表。

例如,用 string.replace:

>>> s="abcd abcd"
>>> s.replace("bc", "XYZ")
'aXYZd aXYZd'

所以同一件事的列表版本应该是这样的:

>>> l=['a','b','c','d',' ', 'a','b','c','d']
>>> l.replace(['b','c'], ['X','Y','Z'])
['a','X','Y','Z',d,' ','a','X','Y','Z',d]

注意:这不仅仅是用其他东西替换列表中的单个元素。它用可能具有不同长度的不同子列表替换所有出现的子列表 - 就像 string.replace() 对子字符串所做的那样。

(我实际使用的列表实际上并不是字符列表,因此无法转换为字符串。)

【问题讨论】:

  • 如果列表不是字符列表,那么它们实际上包含什么?
  • Whats' `l = [1, 1, 1, 1, 1]` 的预期输出将[1, 1] 替换为假设[2, 3]
  • Tim - 它们是对象实例 - 处理不同类型的观察序列
  • iGian 一个合理的选择将是“任何 string.replace 所做的类似物” - 在这种情况下意味着 23231

标签: python python-3.x list replace


【解决方案1】:

没有在列表中搜索子列表的操作。但是,一旦您知道位置。操作简单。

def listfind( haystack, needle ):
  for i in range(len(haystack)-len(needle)):
      if haystack[i:i+len(needle)] == needle:
          return i
  return -1

def listreplace( old, new, haystack ):
    n = listfind( haystack, old )
    if n < 0:
        return haystack
    return haystack[0:n] + new + haystack[n+len(old):]

l=['a','b','c','d',' ', 'a','b','c','d']
l1 = listreplace( ['b','c'], ['X','Y','Z'], l )
print( l1 )

输出:

['a', 'X', 'Y', 'Z', 'd', ' ', 'a', 'b', 'c', 'd']

【讨论】:

  • 是的,它一次只做一个。解决这个问题留给读者作为练习。
  • 对我来说看起来是正确的,并且可能尽可能优雅 - 它确实避免了一个一个地索引单个列表元素(试图摆脱我在 C 30 年中编写字符串版本的方式以前哈哈)
【解决方案2】:

我试过用python写


def replaceSubList(myList,listToReplace,listToBeReplacedWith):
    idx=0
    val=True
    while val:
        if myList[idx:].__contains__(listToReplace[0]) and myList.__len__()>=idx+myList[idx:].index(listToReplace[0])+listToReplace.__len__():
            idx=idx+myList[idx:].index(listToReplace[0])
            if listToReplace==myList[idx+myList[idx:].index(listToReplace[0]):idx+myList[idx:].index(listToReplace[0])+listToReplace.__len__()]:
                myList=myList[0:idx]+listToBeReplacedWith+myList[idx+listToReplace.__len__():]
            elif(idx<myList.__len__()):
                idx+=1
            else:
                val=False
        else:
            val=False

    print(myList)

replaceSubList([1,2,3,4,5,6,7,8,4,12,3,4,5,1,2,3,4,5,6,5,4],[4,5], [110,130,170,200]) 

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2016-11-08
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2015-03-02
    • 2011-12-07
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多