2016-10-12 2 views
0

Я работаю над упражнением, где мы должны моделировать сжатие данных через список. Скажем, нам дали список: [4,4,4,4,4,4,2,9,9,9,9,9,5,5,4,4] Мы должны применить кодировку Run-length и получить новый список [4,6,2,1,9,5,5,2,4,2], где он показывает, сколько 4 (6) 2 (1) 9 (5) 5 (2) и т. Д. Совместно рядом с целым числом.Data Compression Model

До сих пор у меня есть следующий код, однако я ударяя семантическую ошибку, и не уверен, как это исправить:

def string_compression(List): 
     newlist=[] 
     counter=0 
     x=0 
     for elm in List: 
      prev_item= List[x-1] 
      current_item=List[x] 
      if prev_item == current_item: 
       counter+=1 
      else: 
       newlist+=[current_item]+[counter] 
       counter=0 

PS Я еще новичок, поэтому прошу прощения, если это " дурацкий вопрос! Я бы очень признателен за помощь.

+0

Missing отступа после ', если Элем == NewList [i2]:' и вы определяете 'счетчика ', но затем используйте неопределенный' total', вы даже потрудились прочитать сообщение об ошибке? – Julien

+0

@JulienBernu Спасибо Julien. Вы даже потрудились прочитать мой вопрос? Я не сказал синтаксическую ошибку. –

+1

Некоторые мысли. Попробуйте использовать более описательные имена, чем «x», «index», «i», «i2», «counter». (Это настолько бессмысленно, что вы не заметили, что некоторые из них не имеют никакой цели.) Нет смысла проверять, является ли элемент списка членом этого списка. (Когда будет 'List [index] в List' * not * быть истинным?) Вам нужен только один цикл. Решение этого вручную, на бумаге, подальше от компьютера, может быть полезным. – molbdnilo

ответ

0

Ваш код действительно путается со всеми этими счетчиками. Что вам нужно сделать, так это реализовать алгоритм, как он определен. Вам нужен только один индекс i, который отслеживает, в какой позиции списка вы сейчас находитесь, и на каждом шаге сравниваете число с предыдущим номером.

  • , если они равны, то увеличить счетчик
  • , если они не равны, то добавить новую пару гусеничного числа с графом и сброса счетчика на 0 и установить новый идентификационный номер к току номер.
+0

Не будет ли это предположение, что список численно в порядке? –

+0

Как я понимаю, вам нужно закодировать его, а не подсчитывать числа. Например, [2,2,2,2,2,1,1,1,1,2,2,2,2,2] приведет к [2,5,1,4,2,4]. –

+0

Извините, я стою исправлено! –

0

Вы находитесь на правильном пути, но это легче с индексом на основе цикла:

def rle_encode(ls): 
    # Special case: the empty list. 
    if not ls: 
     return [] 

    result = [] 

    # Count the first element in the list, whatever that is. 
    count = 1 
    # Loop from 1; we're considering the first element as counted already. 
    # This is safe because we know that the list isn't empty. 
    for i in range(1, len(ls)): 
     if ls[i] == ls[i - 1]: 
      count += 1 
     else: 
      # Store the last run. 
      result.append(ls[i - 1]) 
      result.append(count) 
      # Count the current number. 
      count = 1 
    # Add the last run since we didn't get a chance to in the loop. 
    result.append(ls[-1]) 
    result.append(count) 

    return result 
+0

большое спасибо @molbdnilo, вы слишком полезны! Я действительно ценю подлинную ясность вашего ответа! –