将指定元素之间的列表元素替换为另一个

2024-04-19 19:41:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有两个列表:

listA = ['A','B','C','D','B','D','A','C']
listB = ['C','B','A','B','C','A','A','C','D','A','B']

我想如何用listBlistB[3 to 9]相同字符之间的元素替换'B','C''D','A'listA[1 to 6]之间的所有元素

因此listB最终将成为:

listB = ['C','B','A','B','C','D','B','D','A','B']

listA最终将成为:

listA = ['A','C']

我创建了一个简单的循环,用于检查'B'、'C'和'D'、'a',并返回它们出现在以下位置的索引:

for i in range(len(gene1)):
    if listA[i] == 'B':
        if listA[i+1] == 'C':
            return I

但是,如果字母序列在字符或长度上发生变化,则这将不起作用


Tags: toin元素列表forlenreturnif
2条回答

字符串和regular expressions有助于解决此类问题:

#conversion  L -> S
strA, strB = [ ''.join(list) for list in [listA,listB] ] 

# split
import re
A1,A2,A3 = re.split('BC|DA',strA)
B1,B2,B3 = re.split('BC|DA',strB)

# conversion S -> L
listA = list( A1 + A3 )  
listB = list( B1 + 'BC' + A2 + 'DA' + B3 ) 

并清楚地表明你在做什么

您可以指定给切片;如果对这两个对象都这样做,则可以就地交换这些块:

listB[3:10] = listA[1:7]
listA[1:7] = []

这首先用listA[1:7]片中引用的所有值替换listB[3:10]片中的所有内容listB可根据需要调整长度

如果您还需要确定起点和终点的位置,则必须首先扫描:

def find_markers(l):
    start, stop = 0, 0
    # iterate over a sliding window; current and next element
    second = iter(l)
    next(second, None)
    for i, (a, b) in enumerate(zip(l, second)):
        if (a, b) == ('B', 'C'):
            start = i
        elif (a, b) == ('D', 'A'):
            end = i + 2
            return start, end  # exit early

a_start, a_end = find_markers(listA)
b_start, b_end = find_markers(listB)
listB[b_start:b_end] = listA[a_start:a_end]
listA[a_start:a_end] = []

相关问题 更多 >