【问题标题】:Python : pop() inside while loop returns error [duplicate]Python:while循环内的pop()返回错误[重复]
【发布时间】:2013-09-25 18:16:11
【问题描述】:

python新手又来了,

我试图重复删除列表的最后一个条目,直到它返回某个字符。但试图运行脚本我得到“IndexError:从空列表中弹出”。那么不知何故 theList 没有包含在 while 循环中?

代码:

theList = list("abc/123")

popStop = ""
popped = ""

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

提前感谢您的帮助。

【问题讨论】:

    标签: python while-loop runtime-error


    【解决方案1】:

    你是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]
    

    【讨论】:

    • 嗯...前面的路很长。非常感谢你。有趣的进展和很好的解释。 :)
    【解决方案2】:

    这种基于类的解决方案将根据通用 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

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多