2016-05-19 4 views
0

Ich habe eine Funktion zum Kombinieren bestimmter Elemente in einer Python-Liste erstellt, aber ich vermute, es gibt einen besseren Weg, den ich trotz extremem googlen nicht finden kann. Ich brauche den Code, um schnell zu sein, da ich das tausende Male machen werde.Gibt es eine bessere Möglichkeit, mehrere Elemente in einer Python-Liste zu kombinieren

mergeleft nimmt eine Liste von Elementen und eine Liste von Indizes. Im folgenden Beispiel nenne ich es als mergeleft (fields, (2,4,5)). Die Einträge 5, 4 und 2 der Liste Felder werden mit dem Element auf der linken Seite verkettet. In diesem Fall werden und d mit c verkettet; b wird mit a verkettet. Das Ergebnis ist eine Liste ('ab', 'cd3', 'f').

fields = ['a','b','c','d', 3,'f'] 

def mergeleft(x, fieldnums): 
    if 1 in fieldnums: raise Exception('Cannot merge field 1 left') 
    if max(fieldnums) > len(x): raise IndexError('Fieldnum {} exceeds available fields {}'.format(max(fieldnums),len(x))) 
    y = [] 
    deleted_rows = '' 

    for i,l in enumerate(reversed(x)): 
     if (len(x) - i) in fieldnums: 
      deleted_rows = str(l) + deleted_rows 
     else: 
      y.append(str(l)+deleted_rows) 
      deleted_rows = '' 

    y.reverse() 
    return y 

print(mergeleft(fields,(2,4,5))) 
# Returns ['ab','cd3','f'] 
+1

Können Sie in Word erklären, was "mergeleft" tun sollte? –

Antwort

2
fields = ['a','b','c','d', 3,'f'] 

Dies setzt voraus, um eine Liste von Indizes in monotonen aufsteigend sortiert. Ich kehre die Reihenfolge um, so dass ich von rechts nach links fusioniere. Für jeden gegebenen Index füge ich dieses Element in das linke zusammen und wandle es an jedem Punkt in eine Zeichenkette um. Beachten Sie, dass ich die Feldnummer Typ zu Liste geändert habe, so dass es leicht reversibel ist. Sie können das Tupel auch in umgekehrter Reihenfolge durchlaufen.

def mergeleft(lst, fieldnums): 
    fieldnums.reverse() 
    for pos in fieldnums: 
     # Merge this field left 
     lst[pos-2] = str(lst[pos-2]) + str(lst[pos-1]) 
     lst = lst[:pos-1] + lst[pos:] 

    return lst 

print(mergeleft(fields,[2,4,5])) 

Ausgang:

['ab', 'cd3', 'f'] 
+0

Erstklassig, vielen Dank. Frustriert darüber, wie schnell du das gemacht hast, nachdem ich wesentlich mehr Zeit damit verbracht habe, über einen besseren Weg nachzudenken !!! Python Tag 2.5, also gebe ich mir ein bisschen Nachsicht. – TacticalSolutions

+2

@TacticalSolutions Beachten Sie, dass dadurch beide Felder und lst an Ort und Stelle mutiert werden. –

+0

@BiRico Ja, tut es. Wenn das ein Problem ist, kann es leicht mit einer Kopie auf lokale Variablen behoben werden. OP, zur Kenntnis nehmen. – Prune

0

Hier ist eine anständig prägnante Lösung, wahrscheinlich unter vielen.

def mergeleft(x, fieldnums): 
    if 1 in fieldnums: raise Exception('Cannot merge field 1 left') 
    if max(fieldnums) > len(x): raise IndexError('Fieldnum {} exceeds available fields {}'.format(max(fieldnums),len(x))) 
    ret = list(x) 
    for i in reversed(sorted(set(fieldnums))): 
     ret[i-1] = str(ret[i-1]) + str(ret.pop(i)) 
    return ret 
Verwandte Themen