2015-01-04 4 views
1

Я очень новичок в программировании, поэтому, пожалуйста, несите меня ... Я изучал Python, и я просто сделал оценку, которая включала цикл через список, используя текущее значение, как следующее значение индекса для перехода во время цикла. Это примерно то, что вопрос был:Цитирование по списку не по порядку в Python

У вас есть нулевая индексация длины массива N положительных и отрицательных целых чисел. Напишите функцию, которая перемещается по списку, создает новый список и возвращает длину нового списка. Пройдя по списку, вы используете свое текущее значение в качестве следующего значения индекса для перехода. Он останавливает цикл, когда A [я] = -1

Например:

A[0] = 1 
A[1] = 4 
A[2] = -1 
A[3] = 3 
A[4] = 2 

Это создало бы:

newlist = [1, 4, 2, -1] 

len(newlist) = 4 

Это было приурочено и я не смог закончить, но это что я придумал. Любая критика ценится. Как я уже сказал, я новичок и стараюсь учиться. Тем временем я буду продолжать искать. Заранее спасибо!

def sol(A): 
    i = 0 
    newlist = [] 
    for A[i] in range(len(A)): 
     e = A[i] 
     newlist.append(e) 
     i == e 
     if A[i] == -1: 
      return len(newlist) 
+0

Вы пробовали там уроки: https://codility.com/programmers/lessons/ –

+0

Я пробовал пару до сих пор. Я начал с курса Python по Codecademy, а затем попробовал курс Intro to Comp Science по Udacity. Есть ли что-нибудь еще, что вы бы порекомендовали? – Christine

ответ

0

Прежде всего, отметим, что for A[i] in range(len(A)) это шаблон, который вы, конечно, хотите, чтобы избежать, как это малоизвестный конструкция, которая будет изменить контрольный список A путем сохранения возрастающих чисел в A[i]. Чтобы перебрать элементы из A, используйте for val in A. Чтобы перебрать индексы в A, используйте for ind in xrange(len(A)).

Цикл for, как правило, предпочтительная конструкция петли на основе Python, не является подходящим инструментом для этой проблемы, поскольку проблема требует итерации по последовательности в непредсказуемом порядке, определяемом содержимым последовательности. Для этого вам нужно использовать более общий цикл while и управлять индексом списка самостоятельно. Вот пример:

def extract(l): 
    newlist = [] 
    ind = 0 
    while l[ind] != -1: 
     newlist.append(l[ind]) 
     ind = l[ind] 
    newlist.append(-1) # the problem requires the trailing -1 
    print newlist  # for debugging 
    return len(newlist) 

>>> extract([1, 4, -1, 3, 2]) 
[1, 4, 2, -1] 
4 

Обратите внимание, что сбор значений в новый список не имеет смысла в любом виде реальной ситуации, потому что список не виден вне функции в любом случае. Более разумная реализация просто увеличит счетчик в каждом проходе цикла и вернет значение счетчика. Но так как проблема явно запрашивает сохранение списка, нужно будет сделать код, подобный приведенному выше.

0

Это проще всего использовать время цикла:

data = [1,4,-1,3,2] 
ls = [] 
i = 0 
steps = 0 
while data[i] != -1: 
    ls.append(data[i]) 
    i = data[i] 
    steps += 1 
    assert steps < len(data), "Infinite loop detected" 
ls.append(-1) 
print ls, len(ls) 
+1

Не забудьте проверить бесконечные петли. –

1

Это может быть самый простой способ сделать это, если ищете наименее строк кода, чтобы написать.

A = [1,4,-1,3,2] 
B = [] 

n = 0 

while A[n] != -1: 
    B.append(A[n]) 
    n = A[n] 

B.append(-1) 

print(len(B)) 
+0

Я считаю, что мои правки, возможно, привели к тому, что код слишком похож на ваш. День идет к вам. –

Смежные вопросы