我一直试图解决这个问题,我似乎无法解决问题。
listy2=['fun','super','Stop']
listy=['great','life','Stop','toys','nothing','Stop']
listpool=[listy,listy2]
current=[]
total=[]
nested=True
for i in listpool:
for line in enumerate(i):
if (line[0]==0):
current.append(line[1])
#skipping first line
continue
if (line[1].strip()!="") and (nested==True):
current.append(line[1])
nested=False
continue
if (line[1].strip()=="Stop"):
nested=True
continue
total.append(current)
#current[:] = []
print total
程序应该输出一个列表列表。 [[列表的第一个元素,嵌套的东西],[列表的第一个元素,嵌套的东西]]
嵌套的东西就像:
hello
blah blah
Stop
在这种情况下嵌套的东西是你好 列表可以有多个嵌套的东西。
cool
blah blah
Stop
good
blah blah
Stop
这个例子中的嵌套东西会很酷很好,(正如你所知,中间的东西都没关系)
在我的代码中,它应该输出
[['fun','super'],['great','life','toys']]
但事实并非如此。
很抱歉,如果我不能很好地解释这个问题,因为英语不是我的第一语言,但我已经习惯了。如果您有任何问题或意见,请在此处发表评论。对不起,如果我做了一些愚蠢的事情。如果你能解释我的错误也会很好,但那不是必要的。 感谢。
答案 0 :(得分:2)
您创建一个 current
列表,通过主循环的所有迭代追加到该列表。您可能希望在每次迭代中创建一个新的current
列表:
for i in listpool:
current = []
...
total.append(current)
答案 1 :(得分:1)
我不太了解你在这里要做的所有事情,但最简单的答案是你没有清除外部循环迭代之间的“当前”列表。
试试这样:
listy2=['fun','super','Stop']
listy=['great','life','Stop','toys','nothing','Stop']
listpool=[listy,listy2]
total=[]
nested=True
for i in listpool:
current=[]
for line in enumerate(i):
if (line[0]==0):
current.append(line[1])
#skipping first line
continue
if (line[1].strip()!="") and (nested==True):
current.append(line[1])
nested=False
continue
if (line[1].strip()=="Stop"):
nested=True
continue
total.append(current)
print total
这是(稍微)更惯用的python:
listy=['great','life','Stop','toys','nothing','Stop']
listy2=['fun','super','Stop']
listpool=[listy,listy2]
total=[]
for i in listpool:
nested=True
current=[]
for (n, line) in enumerate(i):
if (n==0):
current.append(line) #skipping first line
elif nested and line.strip():
current.append(line)
nested=False
elif line.strip()=="Stop":
nested=True
total.append(current)
print total
答案 2 :(得分:1)
我已经将处理单个列表的代码放入一个函数中:我认为这样可以更容易编写代码,更容易测试,也更容易理解。我发现很难给这个函数一个好名字,因为我不太明白这个代码的重点是什么,但这似乎做你想要的。
def stop_words(words):
# Have we ever seen the word 'Stop'?
found_stop = False
# Was the last word seen 'Stop'?
last_stop = False
for word in words:
if word == 'Stop':
found_stop = last_stop = True
continue
if not found_stop or last_stop:
yield word
last_stop = False
print [list(stop_words(words)) for words in [listy, listy2]]
你很难用英语清楚地表达你想要代码做什么,这提示我,你很难在代码中表达。我已经说过代码应该在第一个' Stop'之前提取每一个字。并且只有在“停止”之后的单词此后。
答案 3 :(得分:0)
这很难说,但这是我从问题中收集的内容。您想要一个包含子列表的列表;每个子列表都包含单词“Stop”之前的元素。如果我的解释是关闭的,请告诉我,但看看这是否适合您的需要:
listy2 = ['fun','super','Stop']
listy = ['great','life','Stop','toys','nothing','Stop']
listpool = [listy,listy2]
total = []
for lst in listpool:
current = []
for line in lst:
if line.strip() == "Stop":
total.append(current)
current = []
else:
current.append(line)
print total
[ 14:46 jon@hozbox.com ~/SO/python ]$ ./irritating-python-loop-error.py
[['great', 'life'], ['toys', 'nothing'], ['fun', 'super']]