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

时间:2017-11-09 19:07:38

标签: python

如果我有2个列表:

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

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

以便listB最终成为:

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

和listA最终会成为:

listA = ['A','C']

我创建了一个简单的循环来检查' B' C' C'和' D' A'并返回它们出现的索引:

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

然而,如果字母序列在字符或长度上发生变化,则不会起作用。

2 个答案:

答案 0 :(得分:0)

您可以指定切片;如果你对这两个对象都这样做,你可以将那些块交换到位

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

首先使用listB[3:10]切片中引用的所有值替换listA[1:7]切片中的所有内容。 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] = []

答案 1 :(得分:0)

字符串和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 ) 

清楚地显示你在做什么。