2013-02-22 2 views
0

Что я хочу: я хочу, чтобы список q появился всего три раза. Когда это произойдет, вам будет предложено выбрать один из элементов списка. Каждый раз, когда выбран пример, я хочу, чтобы он исчез и не может быть выбран снова - я даже не хочу, чтобы он выбирал его для отображения. Итак, когда выбран пример 1, он отображает список с примерами 2 и 3. Затем, скажем, пример 3 выбирается следующим образом: список должен отображаться только после примера 2. Вместо этого он отображает с доступными как 1, так и 2, хотя 1 был удален ранее.действительно, ДЕЙСТВИТЕЛЬНО удаляет элемент из списка циклов в Python

Таким образом, проблема заключается в том, что элемент не удаляется навсегда после удаления, и он возвращается во время следующей печати, чего я не хочу.

for x in range(0,3): 
    q = ['example 1', 'example 2', 'example 3'] 
    select = raw_input("> ") 
    if select == "1": 
     del q[0] 
     print q 
    if select == "2": 
     del q[1] 
     print q 
    if select == "3": 
     del q[2] 
     print q 

Похоже, что есть много вопросов об удалении вещей из списка в Python, но я искал ответ в течение нескольких дней и ничего работать еще для моей конкретной ситуации не найдено. Извините заранее за любую глупость, я изучаю программирование всего лишь месяц.

+0

формат вашего кода. – myusuf3

+3

Я не знаю python, но я думаю, вы должны инициализировать список вне цикла for. – smk

+1

ваши индексы будут неправильными после первого прохода через цикл; если я выберем «пример 1» в первый раз, тогда 'пример 2' будет теперь в' q [0] 'и т. д. – Eevee

ответ

7

Причина, по которой ваш текущий код ведет себя так, из-за того, что список «q» инициализируется каждый раз. Тогда ваш способ удаления списка также неверен.

Семантика вашей копии/удаления относится к концепциям глубокой копии в Python, которые здесь не применяются.

Вы хотите использовать тип словаря в Python.

def Foo(): 
    q = {1:'example 1', 2:'example 2', 3:'example 3'}; 
    for x in range(0,3): 
     select = raw_input("> ") 
     if select == "1": 
      del q[1] 
      print q 
     if select == "2": 
      del q[2] 
      print q 
     if select == "3": 
      del q[3] 
      print q 

и более сжато

def foo(): 
    q = {1:'example 1', 2:'example 2', 3:'example 3'}; 
    for x in range(0,3): 
     select = raw_input("> ") 
     del q[int(select)] 
     print q 
+1

Небольшой комментарий - пожалуйста, не используйте имена функций в Python. Это для классов. –

+0

Уверенный - взятый пункт – Arcturus

+0

Большое вам спасибо! – user2097828

0

Попробуйте это:

def menu(): 
    q = {1: 'example 1', 2: 'example 2', 3: 'example 3'} 
    for _ in range(3): 
     print '\n'.join('{} - {}'.format(*item) for item in sorted(q.items())) 
     try: 
      print q.pop(int(raw_input('> ')), "That's not a valid option") 
     except ValueError: 
      print "That's not a valid option" 
    print "No more menu options left!" 
0

Есть ли причина, что вы используете дель здесь? Это кажется слишком маленьким случаем, чтобы беспокоиться о явном удалении объектов. Вам просто нужно удалить их из списка:

q = ['example 1', 'example 2', 'example 3'] 
while len(q)>0: 
    try: 
     select = int(raw_input("> ")) 
     print q.pop(select-1) 
    except (ValueError, IndexError): 
     print 'please enter an integer between 1 and 3' 
Смежные вопросы