Ive a essayé ce problème pendant un certain temps et je ne peux pas sembler sortir le problème.

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

Le programme devrait produire une liste de listes. [[premier élément de la liste, objets imbriqués], [premier élément de la liste, objets imbriqués]]

Les choses imbriquées sont comme:

hello
blah blah
Stop

La chose imbriquée dans ce cas serait bonjour. Les listes peuvent avoir plusieurs choses imbriquées.

cool
blah blah
Stop
good
blah blah
Stop

La chose imbriquée dans cet exemple serait cool et bonne, (comme vous pouvez le voir, les choses au milieu n'ont pas d'importance)

Dans mon code, il DEVRAIT sortir

[['fun','super'],['great','life','toys']]

Mais ce n'est pas le cas.

Désolé si je ne peux pas bien expliquer cette question, car l'anglais n'est pas ma langue maternelle mais je m'y habitue. Si vous avez des questions ou des commentaires, veuillez commenter ici. Désolé si j'ai fait quelque chose de stupide. Ce serait bien aussi si vous pouviez expliquer mon erreur, mais ce ne serait pas nécessaire. Merci.

1
user1008537 23 nov. 2011 à 02:07

4 réponses

Meilleure réponse

Je ne comprends pas tout à fait tout ce que vous essayez de faire ici, mais la réponse la plus simple est que vous n'effacez pas la liste «actuelle» entre les itérations de la boucle externe.

Essayez-le comme ceci:

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

C'est du python (légèrement) plus idiomatique:

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
1
Ian Clelland 22 nov. 2011 à 22:20

C'est difficile à dire, mais c'est ce que j'ai compris de la question. Vous voulez une liste contenant des sous-listes; chaque sous-liste contient les éléments précédant le mot "Stop". Si mon interprétation est erronée, faites-le moi savoir, mais voyez si cela fonctionne pour ce dont vous avez besoin:

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']]
0
chown 22 nov. 2011 à 22:48

J'ai mis le code qui traite une seule liste dans une fonction: je pense que cela rend plus facile à coder, plus facile à tester et plus facile à comprendre. J'ai trouvé difficile de donner un bon nom à la fonction parce que je ne comprends pas vraiment à quoi sert ce code, mais cela semble faire ce que vous voulez.

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

Vous avez eu du mal à exprimer clairement en anglais ce que vous vouliez que le code fasse, ce qui m'indique que vous aurez du mal à exprimer est clairement dans le code. J'aurais dit que le code devrait extraire chaque mot avant le premier «Stop» et seulement les mots après «Stop» par la suite.

1
user97370user97370 22 nov. 2011 à 22:29

Vous créez une current liste à laquelle vous ajoutez à travers toutes les itérations de votre boucle principale. Vous souhaitez probablement créer une nouvelle liste current à chaque itération:

for i in listpool:
    current = []
    ...
    total.append(current)
2
sth 22 nov. 2011 à 22:17
8234526