Я пытаюсь выяснить, как разбить строку на сегменты по 2 слова, где первое слово второго сегмента повторяет последнее слово первого. (в Python 2) Например, "Привет, я человек по имени Джо Норман" должен быть разделен на "Привет я", "Я есть", "Я Джо", "Джо Норман". У меня есть следующий код:
txt = raw_input("")
newtxt = txt.split(" ")
проблема в том, что он разбивает txt на каждый пробел, а не на любой другой. Я бы не хотел использовать библиотеки. Спасибо.
Используйте почтовый индекс:
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))
Выход
hi i
i am
am a
a human
human named
named joe
joe norman
для полноты еще несколько вариантов:
первая версия свободно основана на itertools.pairwise
:
def pairs1(words):
w2 = iter(words)
next(w2, None)
return zip(words, w2)
это хорошо, потому что фрагмент (words[1:]
) в коде Даниэля выше создает копию списка words
который может быть большим, в то время как все, что нужно, это итератор в "другой" позиции
другая версия с использованием range()
:
def pairs2(words):
for i in range(1, len(words)):
yield (words[i-1], words[i])
который похож на Миколу, но мне приятнее. Конечно, любой из них может быть переписан для использования списочных представлений, например:
l = [f'{words[i-1]} {words[i]}' for i in range(1, len(words))]
эквивалентно:
l = [f'{w} {x}' for w, x in pairs2(words)]
Вариант с 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']