Python:pop()在while循环中返回

2024-10-01 15:47:46 发布

您现在位置:Python中文网/ 问答频道 /正文

python新手又来了

我试图重复删除列表的最后一个条目,直到它返回某个字符为止。但在运行脚本时,我得到了“IndexError:pop from empty list”。所以不知怎的,这个列表没有包含在while循环中?在

代码:

theList = list("abc/123")

popStop = ""
popped = ""

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

提前谢谢你的帮助。在


Tags: 代码from脚本列表条目字符poplist
2条回答

你是poping同一个项目两次。你可能是有意的

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

深入思考

有了一点经验,你很快就会意识到,上面的代码不是很像Python。您可以使用for循环编写更好的循环结构。在

^{pr2}$

然后开始查看Python库,发现它有一个很好的iterable工具,名为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中的命名变量不是python。在

最后你得到了一个漂亮的一行

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

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

相关问题 更多 >

    热门问题