刺激Python循环错误?

时间:2011-11-22 22:07:49

标签: python

我一直试图解决这个问题,我似乎无法解决问题。

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']]

但事实并非如此。

很抱歉,如果我不能很好地解释这个问题,因为英语不是我的第一语言,但我已经习惯了。如果您有任何问题或意见,请在此处发表评论。对不起,如果我做了一些愚蠢的事情。如果你能解释我的错误也会很好,但那不是必要的。 感谢。

4 个答案:

答案 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']]