n-е слово в тексте - PullRequest
       6

n-е слово в тексте

0 голосов
/ 21 декабря 2010

как мне найти n-е слово в тексте.

пример:

my_txt("hello to you all" , 3)

all

Я не хочу использовать какую-либо встроенную функцию ... и это не домашнее задание: D

Ответы [ 4 ]

10 голосов
/ 21 декабря 2010

Очевидный способ сделать это:

"hello to you all".split()[3]

80-й способ сделать это - то есть вы должны пройтись по тексту, помня о состоянии вещей, которые вы нашли -может стать лучше, чем это, возможно, но это идея.Представьте, что в любом случае нужно использовать много встроенных функций.Я просто избегаю тех, которые делают это прямо как выше.

def my_txt(text, target):
    count = 0
    last_was_space = False
    start = end = 0
    for index, letter in enumerate(text):
        if letter.isspace():
            if not last_was_space:
                 end = index
            last_was_space = True
        elif last_was_space:
            last_was_space = False
            count += 1
            if count > target:
                return text[start:end]
            elif count == target:
                start = index
    if count == target:
        return text[start:].strip()
    raise ValueError("Word not found")
2 голосов
/ 21 декабря 2010

ОК, ты просил об этом. Вам нужна функция "разбить на слова". Вот. Предполагается, что «слова» ограничены пробелами.

Нет встроенных функций, нет импортированных данных, нет методов встроенных типов, даже нет таких вещей, как +=. И это проверено.

C:\junk>\python15\python
Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> def mysplit(s):
...     words = []
...     inword = 0
...     for c in s:
...         if c in " \r\n\t": # whitespace
...             inword = 0
...         elif not inword:
...             words = words + [c]
...             inword = 1
...         else:
...             words[-1] = words[-1] + c
...     return words
...
>>> mysplit('')
[]
>>> mysplit('x')
['x']
>>> mysplit('foo')
['foo']
>>> mysplit('  foo')
['foo']
>>> mysplit('  foo    ')
['foo']
>>> mysplit('\nfoo\tbar\rzot ugh\n\n   ')
['foo', 'bar', 'zot', 'ugh']
>>>
2 голосов
/ 21 декабря 2010

Поскольку все так или иначе является встроенной функцией, я буду игнорировать ваше утверждение о том, что не хочу использовать встроенные функции.

def my_txt(text, n):
    return text.split()[n]

Главный недостаток в том, что вы получите пунктуацию. Я оставляю это как упражнение, чтобы выяснить, как избавиться от этого. :)

1 голос
/ 21 декабря 2010

Во-первых, позвольте мне сказать, что я абсолютно согласен с комментариями, а другой ответ - не использовать встроенные функции - глупо. При этом я обнаружил, что попытка написать этот код с использованием всего лишь нескольких встроенных вызовов функций была интересной задачей, поэтому я в любом случае опубликую то, что придумала.

def my_txt(txt, n, i=0):
    if n == 1:
        r = ""
        s = 0
        for c in txt:
            if s >= i:
                if c == " ":
                    return r
                r += c
            s += 1
    while txt[i] != " ":
        i += 1
    return my_txt(txt, n - 1, i + 1)

my_txt("hello to you all", 3) # returns 'you'

Мои собственные правила: никаких срезов, пониманий, генераторов или вызовов встроенных функций.

Этот код ужасно потерпит неудачу при попытке получить последнее слово (если нет пробела) или для любого n из диапазона слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...