2017-02-28 2 views
0

Als Beispiel:jedes Vorkommen finden von n verschiedenen Folge von Zeichen in einer Liste von m Zeichen

Ich habe 3 Listen -

seq_to_find = [ 'abc', 'de'] (Länge = n)

main_list = ['a', 'b', 'c' 'ghi' 'd', 'e', ​​ 'weit', 'zuletzt', 'a' , 'b', 'c'] (Länge = m)

transaction_nums = [1,3,6,8,10,15,16,17,19,20,22] (Anmerkung: immer sortiert, Länge = m)

wie finde ich die Anfangs- und Endindexnummern jeder Sequenz, die in der main_list auftritt.

Mit anderen Worten ich eine Funktion schreiben wollen, sagen

def findTheMasks(seq_to_find,main_list,transaction_nums): 

    returns a list with sublists having "start" and "end" transaction_nums 

für das Beispiel oben angegebenen: [[1,6] [10,15] [19,22]]

Bitte Hilfe. Danke im Voraus.

+0

was ist, wenn a, b & c nicht aufeinander folgend sind? – YOBA

+0

Willkommen bei StackOverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [zum Thema] (http://stackoverflow.com/help/on-topic) und [how to ask] (http://stackoverflow.com/help/how-to-ask) gilt hier. StackOverflow ist kein Design-, Codierungs- oder Lernprogrammdienst. Wir helfen Ihnen gerne bei Ihrem Programmierversuch, aber geben uns Ihre Hausaufgaben einfach, ohne Ihren eigenen ernsthaften Versuch zu zeigen, spielen nicht fair. – Prune

+0

Was ist, wenn main_list '[' ab ',' c '] 'enthält, zählt das? –

Antwort

0

Ich nehme an, dass teilweise übereinstimmende Sequenz nicht ins Ergebnis gehen. Und ich nehme auch an, dass es keinen leeren ('') Seq gibt. Hier ist eine Beispiellösung.

seq_to_find = ['abc', 'de'] 
main_list= ['a','b','c','ghi','d','e','far','last','a','b','c'] 
transaction_nums=[1,3,6,8,10,15,16,17,19,20,22] 

def findTheMasks(seq_to_find,main_list,transaction_nums): 
    ret = [] 

    # go through each in main list 
    for i in range(0, len(main_list)): 
     # try to match each seq 
     for seq in seq_to_find: 
      remain = seq 

      # match seq from start, reduce seq if any match, until empty 
      for j in range(i, len(main_list)): 
       x = main_list[j] 

       # remain matches next in main list 
       if remain.startswith(x): 
        remain = remain.replace(x, '', 1) 
        # everything matched 
        if not remain: 
         break 
       # not matched 
       else: 
        break 

      # fully matched, add to result 
      if not remain: 
       ret.append([transaction_nums[i], transaction_nums[j]]) 
    return ret 

print(findTheMasks(seq_to_find, main_list, transaction_nums)) 

Und Ausgabe lautet:

[[1, 6], [10, 15], [19, 22]] 
+0

Danke !!! Lief wie am Schnürchen. Die Annahme ist richtig. teilweise übereinstimmende Sequenz sollte ignoriert werden. Vielen Dank –

Verwandte Themen