2015-10-21 1 views
-1

Je dois écrire un programme qui utilise un codage de longueur d'exécution pour compresser une liste. Je n'ai aucune idée de comment le faire et après avoir changé un peu mon programme à la fois, je ne sais même pas ce qu'il fait maintenant.Fonction de codage de longueur d'exécution (pas de bibliothèques ou de méthodes d'objet)

Nous ne sommes pas autorisés à importer et bibliothèques ou utiliser des méthodes de chaîne python ou liste d'objets (comme append()).

C'est à peu près où je suis maintenant:

def rle(x): 
    c_list = [] 
    count = 0 
    for num in x: 
     if x[num] == x[num - 1]: 
      c+=[x[num], count] 
      count+= 1 
    # ... 
    return c 

en utilisant cette liste comme un exemple:

[8,8,8,4,5,5,5,6,6,6,6,9,8,1,1,1,1,3,3] 

Il va retourner ceci:

[6, 0, 6, 1, 6, 2, 5, 3, 5, 4, 5, 5, 5, 6, 
5, 7, 5, 8, 5, 9, 6, 10, 6, 11, 8, 12, 8, 
13, 8, 14, 8, 15] 

Ce qui est évidemment Vraiment loin.

+0

Qu'est-ce qui doit être retourné? –

+0

il devrait retourner une liste compressée comme: [8,3,4,1,5,3 ...] – Nick

Répondre

1

Quel est le codage censé être? En supposant tuples de (element, count) alors vous pourriez mettre en œuvre un générateur:

def rle(iterable): 
    it = iter(iterable) 
    e, c = next(it), 1  # StopIteration silently handled before Py3.7 
    for n in it: 
     if n == e: 
      c += 1 
      continue 
     yield (e, c)   # "yield from (e, c)" if you need a flat list 
     e, c = n, 1 
    yield (e, c) 

>>> list(rle('aaaaaddddffgghjjjjj')) 
[('a', 5), ('d', 4), ('f', 2), ('g', 2), ('h', 1), ('j', 5)] 
>>> list(rle([8,8,8,4,5,5,5,6,6,6,6,9,8,1,1,1,1,3,3])) 
[(8, 3), (4, 1), (5, 3), (6, 4), (9, 1), (8, 1), (1, 4), (3, 2)] 
+0

Je ne suis pas familier avec "sauf", "StopIteration" et "essayer" donc j'ai du mal suivant le programme – Nick

+0

'try: except:' vous permet de gérer les exceptions, 'next (it)' peut lancer une exception 'StopIteration' si vous passez un itérable vide. Actuellement, vous n'avez pas besoin du bloc try car une anomalie de générateurs gère silencieusement les exceptions 'StopIteration' avant Py3.7. Je vais mettre à jour le code pour supprimer le bloc try - il était là purement pour l'épreuve de l'avenir étant donné que nous sommes seulement sur Py3.5 – AChampion

0
def rle(x): 
    prev = x[0] 
    count = 0 
    for item in x: 
     if item == prev: 
      count += 1 
     else: 
      yield prev, count 
      prev = item 
      count = 1 
    yield prev, count 

x = [8,8,8,4,5,5,5,6,6,6,6,9,8,1,1,1,1,3,3] 
print list(rle(x)) 

impressions

[(8, 3), (4, 1), (5, 3), (6, 4), (9, 1), (8, 1), (1, 4), (3, 2)] 

Si vous avez besoin

[8, 3, 4, 1, 5, 3, 6, 4, 9, 1, 8, 1, 1, 4, 3, 2] 

Remplacez simplement chaque yield avec 2 yields

yield prev 
yield count 
+1

ce qui est 'start' pour, il ne semble pas être utilisé. Et il peut avoir besoin de se prémunir contre une liste vide. – AChampion