python新手再次在这里,
我试图反复删除列表的最后一个条目,直到它返回某个字符。但是尝试运行脚本我得到“IndexError:从空列表中弹出”。所以theList不包含在while循环中?
CODE:
theList = list("abc/123")
popStop = ""
popped = ""
while popStop != "/":
if theList.pop() != "/":
popped = popped + str(theList.pop())
else:
popStop = "/"
提前感谢您的帮助。
答案 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