2017-01-31 6 views
-1

Извините, если это уже было задано; Я не мог найти вопрос, который был достаточно похож на мою, где я мог бы получить удовлетворительный ответ.Подсчет последовательных номеров в списке

Я довольно новичок в python (3.4.3). Я пытаюсь добавить элементы в пустой список, используя цикл for, сравнивая элементы другого списка со следующим элементом во втором списке (ужасное объяснение, я извиняюсь).

Вот мой код до сих пор:

random_list=[1,4,5,6,7,9,19,21,22,23,24] 

def count_consec(random_list): 
    count=1 
    consec_list=[] 
    for i in listrand: 
     if listrand[i] == listrand[i+1]+1: 
      count+=1 
     else: 
      list.append(count) 
    return consec_list 

В принципе, я хочу, чтобы добавить в список [] значения, которые представляют, как длина последовательных блоков чисел в random_list [].

Я ожидаю, что мой выход в этом случае выглядеть следующим образом:

[1,4,1,1,4] 

Как и есть один единственное число, а затем 4 последовательных чисел, а затем одним единственным числом, за которым следует один единственного числа, а затем 4 последовательных номера.

Я попытался это много различных способов, и я получил функцию для создания списка, но все элементы 1-х ...

Спасибо за вашу помощь!

+0

'listrand' не определено – RomanPerekhrest

+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не разместите свой код MCVE и не сможете точно описать проблему. Ваш код не компилируется. После исправления имени параметра (random_list to listrand) он умирает за неправильное использование ** append **. Это не MCVE. – Prune

+0

Я все еще запутался в выходе = ( –

ответ

1

Вы могли бы принять такой подход, как это:

def countlist(random_list): 
    retlist = [] 
    # Avoid IndexError for random_list[i+1] 
    for i in range(len(random_list) - 1): 
     # Check if the next number is consecutive 
     if random_list[i] + 1 == random_list[i+1]: 
      count += 1 
     else: 
      # If it is not append the count and restart counting 
      retlist.append(count) 
      count = 1 
    # Since we stopped the loop one early append the last count 
    retlist.append(count) 
    return retlist 
+0

подумайте над добавлением комментариев, особенно по последнему 'retlist.append (count)'. Это может быть очевидно для вас, но OP сказал, что он новичок :) –

+0

Спасибо! Помимо начального: count = 0, это отлично работало! –

0

Следующий код исправляет его. Вы повторяли элементы самого списка, а не счетчик, на который вы ссылались.

random_list=[1,4,5,6,7,9,19,21,22,23,24] 

def count_consec(listrand): 
    count=1 
    consec_list=[] 
    for i in range(len(listrand[:-1])): 
     if listrand[i]+1 == listrand[i+1]: 
      count+=1 
     else: 
      consec_list.append(count) 
      count=1 

    # Account for the last iteration 
    consec_list.append(count)  

    return consec_list 

print(count_consec(random_list))  

возвращает это:

[1, 4, 1, 1, 4] 
0

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

Вместо этого я бы предложил использовать рецепт zip(lst, lst[1:]) для итерации пар элементов из списка и с помощью consec[-1] для доступа и изменения подсчетов, уже внесенных в список.

def count_consec(lst): 
    consec = [1] 
    for x, y in zip(lst, lst[1:]): 
     if x == y - 1: 
      consec[-1] += 1 
     else: 
      consec.append(1) 
    return consec 

random_list=[1,4,5,6,7,9,19,21,22,23,24] 
print(count_consec(random_list)) 
# [1, 4, 1, 1, 4]