1
votes

comment diviser une chaîne en différents segments de 2 mots où le premier mot du deuxième segment répète le dernier mot du premier

J'essaie de comprendre comment diviser une chaîne en segments de 2 mots où le premier mot du deuxième segment répète le dernier mot du premier. (en Python 2) Par exemple, "salut je suis un humain nommé joe norman" devrait être découpé en "salut je", "je suis", "suis joe", "joe norman". J'ai le code suivant:

txt = raw_input("")

newtxt = txt.split(" ")

le problème avec ceci est qu'il divise le txt par chaque espace, pas tous les autres. Je ne souhaite utiliser aucune bibliothèque. Merci.


1 commentaires

Corrigez votre exemple de bourgeon.


3 Réponses :


3
votes

Utilisez zip :

hi i
i am
am a
a human
human named
named joe
joe norman

t = "hi i am a human named joe norman"
words = t.split()

result = list(zip(words, words[1:]))

for first, second in result:
    print("{} {}".format(first, second))


0 commentaires

0
votes

Option avec listcomp:

s = "hi i am a human named joe norman"
s = s.split()

l = [f'{i} {s[num + 1]}' for num, i in enumerate(s)
    if num + 1 < len(s)]

print(l) #['hi i', 'i am', 'am a', 'a human', 'human named', 'named joe', 'joe norman']


0 commentaires

0
votes

pour être complet, quelques options supplémentaires:

la première version est vaguement basée sur itertools.pairwise :

l = [f'{w} {x}' for w, x in pairs2(words)]

c'est sympa car la tranche ( mots [1:] ) dans le code de Daniel ci-dessus crée une copie de la liste des mots qui pourrait être grande, alors que tout ce qui est nécessaire est un itérateur à une position "différente"

une autre version utilisant range () :

l = [f'{words[i-1]} {words[i]}' for i in range(1, len(words))]

qui est similaire à Mykola mais me semble plus agréable. Bien sûr, l'un ou l'autre pourrait être réécrit pour utiliser des compréhensions de liste, par exemple:

def pairs2(words):
    for i in range(1, len(words)):
        yield (words[i-1], words[i])

équivaut à:

def pairs1(words):
    w2 = iter(words)
    next(w2, None)
    return zip(words, w2)


0 commentaires