Python:pop()里面循环返回错误

时间:2013-09-25 18:16:11

标签: python while-loop runtime-error pop

python新手再次在这里,

我试图反复删除列表的最后一个条目,直到它返回某个字符。但是尝试运行脚本我得到“IndexError:从空列表中弹出”。所以theList不包含在while循环中?

CODE:

theList = list("abc/123")

popStop = ""
popped = ""

while popStop != "/":
   if theList.pop() != "/":
      popped = popped + str(theList.pop())
   else:
     popStop = "/"

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

你是poping两次相同的项目。你可能打算

while popStop != "/":
   item = theList.pop()
   if item != "/":
      popped = popped + str(item)
   else:
     popStop = "/"

深思熟虑

通过一点经验你很快就会意识到,上面的代码并不是非常pythonic。您可以使用for循环编写更好的循环结构。

for e in reversed(theList):
    if e != '/':
        popped += e
    else:
        popStop = e
        break

然后你开始浏览Python库并意识到它有一个非常好的可迭代工具itertools,所以你最终使用takewhile编写另一个版本

from itertools import takewhile
popped  = ''.join(takewhile(lambda e: e != '/', reversed(theList)))

现在有了更多的经验,你很快就会意识到,你实际上正在分裂一条路径而且Python非常友好,可以为你保留一个库(os.path.split)函数。

os.path.split(theList)[-1][::-1]

与此同时,你已经向PEP-8介绍了自己的官方风格指南,当你意识到,在CamelCase中命名变量不是Pythonic。

然后你最终得到一个漂亮的单行

os.path.split(the_list)[-1][::-1]

答案 1 :(得分:0)

这个基于类的解决方案将根据通用的stop_item元素制作技巧并根据需要生成每个项目:

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
stackoverflow_19012268.py

@author:  Luis Martin Gil
@contact: martingil.luis@gmail.com

https://github.com/luismartingil
www.luismartingil.com
'''

class MyStopReversedList(list):
    """ Implements a list based on a reversed way to iterate over it.
    """
    def __init__(self, stop_item, list):
        self.stop_item = stop_item
        super(MyStopReversedList, self).__init__(list)

    def __iter__(self):
        """ Iterates the list until it reaches stop_item """
        while True:
            try:
                item = list.pop(self)
                if item is self.stop_item: break
                else: yield item
            except:
                break

if __name__ == "__main__":
    # Lets work on some examples
    examples = [
        {
            # Example1. Integers list
            'stop_item' : 3,
            'my_list' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 11, 12, 13]
            },
        {
            # Example2. String
            'stop_item' : '/',
            'my_list' : "abc/123"
            }
        ]

    for example in examples:
        the_list = MyStopReversedList(example['stop_item'],
                                      example['my_list'])
        # Lets try to iterate over the list n times
        n = 4
        print 'Example', example
        for iteration in range(n):
            for item in the_list:
                print '(iteration:%i) %s' % (iteration, item)
            print '-' * 40
        print '\n'

    # Outputs
    # Example {'my_list': [1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 11, 12, 13], 'stop_item': 3}
    # (iteration:0) 13
    # (iteration:0) 12
    # (iteration:0) 11
    # (iteration:0) 10
    # ----------------------------------------
    # (iteration:1) 9
    # (iteration:1) 8
    # (iteration:1) 7
    # (iteration:1) 6
    # (iteration:1) 5
    # (iteration:1) 4
    # ----------------------------------------
    # (iteration:2) 2
    # (iteration:2) 1
    # ----------------------------------------
    # ----------------------------------------


    # Example {'my_list': 'abc/123', 'stop_item': '/'}
    # (iteration:0) 3
    # (iteration:0) 2
    # (iteration:0) 1
    # ----------------------------------------
    # (iteration:1) c
    # (iteration:1) b
    # (iteration:1) a
    # ----------------------------------------
    # ----------------------------------------
    # ----------------------------------------

获取代码here