2
votes

Diviser la liste en sous-listes d'éléments entre les jetons d'ouverture et de fermeture

J'ai une liste de chaînes (voir ci-dessous). Je veux obtenir les éléments de la liste en recherchant deux jetons spécifiques (début et fin), puis enregistrer toutes les chaînes présentes entre ces jetons.

Par exemple, j'ai la liste ci-dessous et je veux obtenir toutes les chaînes entre tout occurrence des chaînes 'RATED' et 'Like' . Il peut également y avoir plusieurs occurrences de ces sous-séquences.

['RATED',
 '  Awesome food at a good price .',
 'Delivery was very quick even on New Year\xe2\x80\x99s Eve .',
 'Please try crispy corn and veg noodles From this place .',
 'Taste maintained .',
 'Like',
 '1',
 'Comment',
 '0',
 'Share',
 'Divyansh Agarwal',
 '1 Review',
 'Follow',
 '3 days ago',
 'RATED',
 '  I have tried schezwan noodles and the momos with kitkat shake',
 "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone",
 'Like']

J'ai essayé différentes méthodes, comme regex, mais aucune n'a résolu le problème.


2 commentaires

Alors pour les mots récurrents, voulez-vous utiliser le premier comme limite? Veuillez fournir votre résultat attendu en plus de ce que vous avez essayé.


La sortie attendue n'est rien d'autre qu'une liste de mots contenant les mots entre ces deux mots à l'exclusion de ceux-ci.


7 Réponses :


1
votes

Vous pouvez essayer, par exemple,

#[' Awesome food at a good price .',
# 'Delivery was very quick even on New Year’s Eve .',
# 'Please try crispy corn and veg noodles From this place .',
# 'Taste maintained .',
# ' I have tried schezwan noodles and the momos with kitkat shake',
# "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone"]

résultat

rec = False
result = []
for s in lst:
    if s == 'Like':
        rec = False
    if rec:
        result.append(s)
    if s == 'RATED':
        rec = True


1 commentaires

Si le résultat souhaité est une liste de mots, il peut être utile de remplacer result.append (s) par result.extend (s.strip (). Split ('')) < / code>



1
votes
def find_between(old_list, first_word, last_word):
    new_list = []
    flag = False
    for i in old_list:
        if i is last_word:
            break
        if i is first_word:
            flag = True
            continue
        if flag:
            new_list.append(i)
    return new_list

0 commentaires

2
votes

Vous pouvez utiliser une expression régulière Vous devez d'abord rejoindre votre liste avec un délimiteur qui n'apparaîtra pas dans le texte

for s in results:
    print(s.split(delimiter))

Après cela, vous pourrez utiliser une expression régulière

results = re.findall(r'#\$#RATED#\$#(.*?)#\$#Like#\$#', bigString)

Maintenant il vous suffit d'itérer tous les résultats et de séparer la chaîne avec un délimiteur

delimiter = "#$#"
bigString = delimiter + delimiter.join(yourList) + delimiter


2 commentaires

Vous avez toujours une partie de votre délimiteur dans la première et la dernière chaîne des listes d'impression.


Merci pour le commentaire. J'ai fait un changement dans l'expression régulière.



1
votes

en utilisant regex, vous pouvez le faire de la manière suivante.

['   Awesome food at a good price . Delivery was very quick even on New Year’s Eve . Please try crispy corn and veg noodles From this place . Taste maintained . ',
 "   I have tried schezwan noodles and the momos with kitkat shake And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone "]

sortie

a= ['RATED','  Awesome food at a good price .', 
 'Delivery was very quick even on New Year’s Eve .', 
 'Please try crispy corn and veg noodles From this place .', 
 'Taste maintained .', 'Like', '1', 'Comment', '0', 
 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', 
 '3 days ago', 'RATED', 
 '  I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 
 'Like']


import re
string = ' '.join(a)
b = re.compile(r'(?<=RATED).*?(?=Like)').findall(string)
print(b)


1 commentaires

Merci. C'est exactement ce que je voulais :)



2
votes

Je vous suggère de vous renseigner sur la recherche d'index et le découpage des types de séquence:

Exemple:

['  Awesome food at a good price .', 'Delivery was very quick even on New Year’s Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .']
['  I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone"]

Le résultat est:

def group_between(lst, start_token, end_token):
    while lst:
        try:
            # find opening token
            start_idx = lst.index(start_token) + 1
            # find closing token
            end_idx = lst.index(end_token, start_idx)
            # output sublist
            yield lst[start_idx:end_idx]
            # continue with the remaining items
            lst = lst[end_idx+1:]
        except ValueError:
            # begin or end not found, just skip the rest
            break

l = ['RATED','  Awesome food at a good price .', 'Delivery was very quick even on New Year’s Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', 'Like', 
     '1', 'Comment', '0', 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', '3 days ago',
     'RATED', '  I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 'Like'
]

for i in group_between(l, 'RATED', 'Like'):
    print(i)


0 commentaires

1
votes

Une option sans indicateur:

new_list = []
group = [] # don’t need if the list starts with 'RATED'

for i in your_list:
    if i == 'RATED':
        group = []
    elif i == 'Like':
        new_list.append(group[:])
    else:
        group.append(i)


0 commentaires

1
votes

Vous pouvez utiliser le code ci-dessous qui utilise une boucle for simple:
l = ['RATED','  Awesome food at a good price .', 'Delivery was very quick even on New Year’s Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', 'Like', 
     '1', 'Comment', '0', 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', '3 days ago',
     'RATED', '  I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 'Like'
]

st, ed, aa = None, None, []
for k, v in enumerate(l):
    if v == "RATED":
        st = k
    if v == "Like":
        ed = k
    if st != None and ed!= None:
        aa.extend(l[st+1: ed])
        st = None
        ed = None

print (aa)

# ['  Awesome food at a good price .', 'Delivery was very quick even on New Year’s Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', '  I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone"]


0 commentaires