2017-11-09 4 views
1

Wenn ich 2 Listen haben:zwischen bestimmten Elementen Elemente der Liste ersetzen anderen in

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

Wie würde ich alle Elemente zwischen 'B','C' und 'D','A', listA[1 to 6] mit den Elementen zwischen den gleichen Zeichen von listB ersetzen möchten , listB[3 to 9].

so dass ListeB würde am Ende als:

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

und listA würde am Ende als:

listA = ['A','C'] 

Ich habe eine einfache Schleife erstellt, die für 'B', 'C' überprüft und ‚D‘, ‚A‘ und gibt die Indizes, in denen sie auftreten bei:

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

aber das wird nicht funktionieren, wenn die Buchstabenfolgen in ändern Zeichen oder Länge.

+1

Was haben Sie versucht zu tun? – depperm

+0

Wie haben Sie die zu ersetzenden Indizes definiert? Durch die Suche nach den Paaren "B", "C" und "D", "A"? –

Antwort

0

Sie können Scheiben zuweisen; wenn Sie so für beide Objekte zu tun, können Sie diese Stücke anstelle tauschen:

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

Dieses erste in der listA[1:7] Scheibe verwiesen alles in der listB[3:10] Scheibe mit allen Werten ersetzt. listB ist in der Länge nach Bedarf anzupassen.

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] = [] 
0

Strings und regular expressions helfen können, solche Probleme zu lösen:

Wenn Sie auch die Start- und Endpunkte, um herauszufinden, wo es brauchen, dann würden Sie zuerst scannen müssen

#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) 

Und zeigt deutlich, was Sie tun.

Verwandte Themen