2015-04-13 3 views
1

Я пытаюсь сделать функцию, когда список пуст, второй список будет пустым в пустой в обратном порядке. Прямо сейчас, я пытался сделать:Опоздание списка в новый список

a = [1,2,3,4] 
b = [] 
def a_to_b(a, b): 
    if not a: 
     print('a:',a)   
     print('b:',b) 
     for c in b: 
      a.append(c) 
      b.remove(c) 
     print('a:',a) 
     print('b:',b) 
     return True 
    else: 
     top = a.pop() 
     b.append(top) 
     print('a:',a) 
     print('b:',b) 
     return True 

Я хочу, чтобы после каждого запуска:

1) a = [1,2,3] 
    b = [4] 
2) a = [1,2] 
    b = [4,3] 
3) a = [1] 
    b = [4,3,2] 
4) a = [] 
    b = [4,3,2,1] 
5) a = [1,2,3,4] 
    b = [] 

Но после пятой перспективы это дает мне

a = [4,2] 
b = [3,1] 

И я не могу выяснить, почему он применяется только к любому другому числу в b.

+1

Является ли это проблема домашнего задания? Потому что есть намного более простые способы сделать это в python, чем то, как вы это делаете. – Greg

+0

Нет, это не так, просто личный проект, над которым я работал. Какие более простые способы? – greenthumbtack

ответ

2

Это должно работать

a = [1,2,3,4] 
b = [] 
for i in range(len(a)): 
    b.append(a[-1]) 
    a.pop() 
    print a,b 

+0

Вы можете просто выполнить 'b.append (a.pop())' – Shashank

1

Ваша проблема вызвана вы удаляете элементы, которые вы прыгающих через в течение цикла)

Указатель будет как индекс 0, 1, 2, 3, но вы уже удаление 0-й элемент в результате чего указатель идти прямо к 2 (который в настоящее время индекс 1 в остальном списке)

, чтобы избежать этого, вы можете изменить свой код:

for c in b: 
    a.append(c) 
for c in a: 
    b.remove(c) 
1

Вот причина, почему вы получаете странный результат:

for c in b: 
     a.append(c) 
     b.remove(c) 

Вы меняете список букв b, когда вы повторяете его. Таким образом, вещи не выйдут, как вы ожидаете. Почему бы вам просто не сделать

b.reverse() 
a = b 
b = [] 

Вместо того, что у вас было до этого. Так было бы

a = [1,2,3,4] 
b = [] 
def a_to_b(a, b): 
    if not a: 
     print('a:',a)   
     print('b:',b) 
     b.reverse() 
     a = b 
     b = [] 
     print('a:',a) 
     print('b:',b) 
     return True 
    else: 
     top = a.pop() 
     b.append(top) 
     print('a:',a) 
     print('b:',b) 
     return True 
0

Проблема здесь:

for c in b: 
     a.append(c) 
     b.remove(c) 

Вы не можете удалить объекты середине interable, не смущая петлю.

Вот что происходит:

Вы b=[4,3,2,1] и a=[]. Вы начинаете цикл for, а c указывает на первый индекс b, т.е. 4. Вы удаляете c из списка и помещаете его в a.

Теперь у вас есть b = [3,2,1] и a=[4], как и вы ожидали.

При попытке запустить следующий цикл индекс увеличивается (c теперь указывает на 2-й элемент), но проблема в том, что вы столкнулись со структурой итерабельного. Таким образом, петля удаляет c, как и предполагалось, но c=2, а не 3, как вы ожидаете.

Теперь у вас есть a=[4,2] и b=[1,3], и когда цикл проверяет индекс 3, он обнаруживает, что b имеет только 2 элемента, поэтому он выходит.

1
def f(a, b): 
    if a: 
     b.append(a.pop()) 
    else: 
     while b: 
      a.append(b.pop()) 
    print 'a: %s' % a 
    print 'b: %s' % b 

>>> a = [1, 2, 3, 4] 
>>> b = [] 
>>> f(a, b) 
a: [1, 2, 3] 
b: [4] 

>>> f(a, b) 
a: [1, 2] 
b: [4, 3] 

>>> f(a, b) 
a: [1] 
b: [4, 3, 2] 

>>> f(a, b) 
a: [] 
b: [4, 3, 2, 1] 

>>> f(a, b) 
a: [1, 2, 3, 4] 
b: [] 
+2

Вы можете просто использовать 'if a' здесь ... и' while b' - не нужно проверять их длину –

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