Итерация по стеку (обратный список), есть ли метод isempty ()? - PullRequest
8 голосов
/ 28 декабря 2010

Какой лучший способ перебора стека в Python?

a = [1,2,3,4]
while (len(a) > 0)
  print a.pop()

# prints 4, 3, 2, 1 in sequence

Я не смог найти метод isempty, и проверка длины каждый раз кажется неправильной.

Ответы [ 3 ]

26 голосов
/ 28 декабря 2010

Обычным соглашением для контейнеров является то, что они True, но не пустые, и False, когда пустые, поэтому вы можете просто сделать:

while a:
    print a.pop()
6 голосов
/ 28 декабря 2010

Использовать список как логическое условие, которое оценивается как False, только если список пуст:

>>> while a:
...     print a.pop()
... 
4
3
2
1

Это не только более кратко, но и более эффективно (1,49 мс против 1,9 мс для списка из 10 000), поскольку нужно только проверить, существует ли первый элемент:

$ python -mtimeit -c 'a=range(10000)
while len(a):
  a.pop()'
10000 loops, best of 3: 1.9 msec per loop
$ python -mtimeit -c 'a=range(10000)
while a:     
  a.pop()'
1000 loops, best of 3: 1.49 msec per loop

Вы также можете использовать reversed(), чтобы получить обратный итератор:

>>> for n in reversed(a):
...     print n
... 
4
3
2
1

или в одну строку:

print '\n'.join(map(str, reversed(a)))

Обратите внимание, что это не удалит элементы из списка. При необходимости вы можете добиться этого с помощью del a[:].

2 голосов
...