0

Betrachten das „string“ (behandle es als eine Anordnung von Ziffern)„Splitting“, die Ausgabe eines RLE (groupby) in Abhängigkeit von einem definierten Wert (das „Zeichen“ auf die RLE aufzuspalten)

0 0 1 8 8 8 1 0 

die RLE („groupby“) ist:

[(0,2), (1, 1), (8,3), (1, 1), (0, 1)] 

wir dann mit der Summe der Lauflängen der vorangehenden Elemente des obigen RLE reichern.

somit die angereicherte Version des obigen wird:

[(0, (0,2)), (0+2, (1, 1)), (0+2+1, (8,3)), (0+1+2+3, (1, 1)), (0+1+2+3+1, (0, 1))] 

Die "string" Split von 1:

0 0 , 8 8 8 , 0 

RLE Split auf 1

[(0,2)] , [(8,3)] , [(0, 1)] 

Die „string "Split auf 8:

0 0 1 , , , 1 0 

RLE Split auf 8

[(0,2), (1, 1)] , , , [(1, 1), (0, 1)] 

Hinweis: In meinen Beispielen habe ich ohne bereichern sie die "RLE Split auf Z" Listen zitiert. Das wäre nicht so. Ich habe sie weggelassen, um Unordnung zu vermeiden. Zum Beispiel sollte wirklich das "RLE Split auf 1" wird behandelt wie:

[(0, (0,2))] , [(0+2+1, (8,3))] , [(0+1+2+3+1, (0, 1)] 

Wie kann ich dieses "RLE split" auf Z erreichen (= 1, 8; in diesem Fall)

Es ist in Ordnung, leere Arrays (nach dem Split) wegzulassen.

Vielleicht eine kluge Liste comp.? (Es scheint ein wenig leichter mit einem lösen for-Schleife mit einer append verschachtelt innerhalb)

+1

Ich bin verwirrt. Soll ein Ausdruck wie '0 + 2 + 1' eine Zeichenkette sein oder willst du '3'? – aaronasterling

+0

Nur 3 - Ich wollte die Dinge abbauen, um lesbar zu sein. Entschuldigung für die Verwirrung! – PoorLuzer

+0

Angenommen RLE = [(0,2), (1,1), (8,3), (4,2), (1,1), (0,1)]; Sollte das Ergebnis [(0, (0,2))] sein, [(0 + 2 + 1, (8,3), ** (4,2) **)], [(0 + 2 + 1 + 3 + 2 + 1, (0, 1)] oder [(0, (0,2))], [(0 + 2 + 1, (8,3)), ** (0 + 2 + 1 + 3 , (4,2)) **], [(0 + 2 + 1 + 3 + 2 + 1, (0, 1)] – Kabie

Antwort

1

Just for Show die Art und Weise, wie ich Ihnen dringend raten, nicht diese

„elegant“ hässliche Art und Weise zu nutzen:

>>> data 
[0, 0, 1, 8, 8, 8, 4, 4, 1, 0] 
>>> def fromDataToSplitRLE(dat,n): 
    RLE=[(k,len(tuple(g))) for k,g in itertools.groupby(dat)] 
    tmp=tuple(zip(*RLE)) 
    return [list(g) for k,g in itertools.groupby((zip((sum(tmp[1][:i]) for i in range(len(tmp[1]))) ,(zip(*tmp)))),lambda x:x[1][0]!=n) if k] 

>>> fromDataToSplitRLE(data,1) 
[[(0, (0, 2))], [(3, (8, 3)), (6, (4, 2))], [(9, (0, 1))]] 
+1

bekommen @Aaronasterling: Nun, ich habe es falsch verstanden. Wird es verbessern. – Kabie

+0

Ich würde sehr gerne sehen, dass Sie dies mit einem Listenverständnis erreichen. – aaronasterling

+0

Beachten Sie, dass dies zwei groupby-Anrufe erfordert. Es macht jedoch das Teilen ohne weitere Verarbeitung korrekt, während aarons einen weiteren Durchlauf auf Keine erfordert. – PoorLuzer

1
import itertools 

def get_rle(list_of_digits, split_on=None): 
    count = 0 
    rle = [] 
    active_group = [] 
    rle_app = rle.append 
    for item, group in itertools.groupby(list_of_digits): 
     L = len(list(group)) 
     if item == split_on: 
      rle_app(active_group) 
      active_group = [] 
     else: 
      active_group.append((count, (item, L))) 
     count += L 

    rle_app(active_group) 
    return rle 

list_of_digits = map(int, '0 0 1 8 8 8 1 0'.split()) 
print get_rle(list_of_digits) 
print get_rle(list_of_digits, 8) 
print get_rle(list_of_digits, 1) 

[email protected]:~/code/tmp$ python rle.py 
[[(0, (0, 2)), (2, (1, 1)), (3, (8, 3)), (6, (1, 1)), (7, (0, 1))]] 
[[(0, (0, 2)), (2, (1, 1))], [(6, (1, 1)), (7, (0, 1))]] 
[[(0, (0, 2))], [(3, (8, 3))], [(7, (0, 1))]] 
+0

Ich hatte dies bereits geschrieben (und ohne die None. Beachten Sie, dass ich erwähnt habe * "Es ist in Ordnung, leere Arrays wegzulassen nach dem Split). "*) Deshalb habe ich * kommentiert (" Es scheint ein bisschen einfacher zu sein, mit einer for-Schleife zu lösen, in der ein Append verschachtelt ist) "* - ** Ich suche etwas schneller - wie eine Liste compr. ** Ideen? – PoorLuzer

+1

@ PoorLuzer. Siehe meine Notiz am Ende. Ich habe es gerade bearbeitet. Dadurch wird es deutlich schneller gehen. – aaronasterling

+2

In (count, (item, L)) sollte count der Startindex sein, also plus L nach der if-Anweisung – Kabie

Verwandte Themen