如果我有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]
和listB
,listB[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
然而,如果字母序列在字符或长度上发生变化,则不会起作用。
答案 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 )
清楚地显示你在做什么。