2013-10-08 4 views
-5

Я пытаюсь написать функцию, которая принимает входные данные списка и параметр, который равен 0 или 1. Если это 0, я хочу вернуть список элементов, которые больше, чем абсолютное значение 5. Если это вариант 1, я хочу вернуть список элементов, это нечетные числа. Я также хочу использовать цикл while. Где я иду не так?Непонимание этого цикла while

def splitList2(myList, option): 
    nList = [] 
    element = 0 
    while element < len(myList): 
     if option == 0: 
      if abs(element) > 5: 
       nList.append(element) 
     elif option == 1: 
      if element % 2: 
       nList.append(element) 
     element = element + 1 
    return nList 
+0

Вы не могли опубликовать это? – roippi

+0

Я уже объяснял вам, что вы использовали индекс, как если бы это был элемент, и вызов его 'element' вас сбивал с толку, и вы могли исправить его, переименовав его, а затем (a) заменив' element' на 'myList [index] 'везде, где он появился, или (b) добавление' element = myList [index] 'в начало цикла. Никто не будет иметь ничего другого, чтобы рассказать вам об этом. – abarnert

+0

@abarnert и я не понял эту часть. Я просто начинающий, и даже с правильным кодом трудно понять, что происходит. –

ответ

1

element является индексом, а не элемент из myList. Я хотел бы переименовать текущую element переменного на что-то вроде index, а затем добавить element = myList[index] в верхней части времени цикла:

def splitList2(myList, option): 
    nList = [] 
    index = 0 
    while index < len(myList): 
     element = myList[index] 
     if option == 0: 
      if abs(element) > 5: 
       nList.append(element) 
     elif option == 1: 
      if element % 2: 
       nList.append(element) 
     index = index + 1 
    return nList 

Конечно, было бы проще просто использовать for element in myList петли здесь вместо вашего цикла.

-1
nList.append(myList[element]) 

вы действительно не должны назвать указательный элемент, то где ваша растерянность от

+0

все еще дает мне неправильный ответ после этого шага. @prgao –

0

Вы используете element как имя для индекса элемента, что сбивает с толку. И действительно, позже вы исследуете/добавляете индекс вместо соответствующего элемента из myList!

Альтернативная версия:

def splitList2(myList, option): 
    nList = [] 
    n = 0 
    while n < len(myList): 
    element = myList[n] 
     if option == 0: 
      if abs(element) > 5: 
       nList.append(element) 
     elif option == 1: 
      if element % 2: 
       nList.append(element) 
     element = element + 1 
    return nList 

также while не является лучшим выбором для такой задачи. Я предполагаю, что вы пытаетесь это сделать, используя while по образовательным причинам. Тем не менее, гораздо более Pythonic способ:

def splitList2(myList, option): 

    options = { 
     0: lambda n: abs(n) > 5, 
     1: lambda n: n % 2 
    } 

    return filter(options[option], nList) 
0

Почему вы не просто создать два списка для обоих случаев вы хотите, и перебирать данный список без какой-либо переменной индекса?

def splitList2(myList): 
    list1 = [] 
    list2 = [] 
    for element in myList: 
     if abs(element) > 5: 
      list1.append(element) 
     if element & 1: # check the 0 bit 
      list2.append(element) 
return list1, list2 
0

Я собираюсь ответить только на «где я ошибаюсь?» вопрос.

  1. У вас есть две разные проблемы. Они принадлежат двум различным функциям, которые вы будете отлаживать независимо друг от друга.
  2. Вы выбрали использование цикла while в качестве части решения. Это может быть частью решения, но это может быть плохой подход. Возможно, это хорошо ни для одного, ни для одного из ваших проблем.
  3. Вы новичок в python и, возможно, в программировании. В этом нет ничего плохого. Удачи. Вы должны научиться сокращать проблемы до их простейшей формы, прежде чем пытаться решить какое-либо решение. Обычно для любой проблемы, которую вы имеете, вы можете найти ряд небольших проблем, которые легко решить. Решите их один за другим, затем интегрируйте решения с небольшими задачами в решение исходной задачи.
  4. В каждой из двух проблем вы, скорее всего, обнаружите, что в python предпочтительнее использовать элемент for inerable:. Например, «для слова в словах:», «для элемента в алисте» и т. Д.
Смежные вопросы