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.
3 Réponses :
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))
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']
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)
Corrigez votre exemple de bourgeon.