2010-12-21 17 views
-3

テキストのn番目の単語を検索する方法はありますか。テキストのn番目の単語

例:

my_txt("hello to you all" , 3) 

all 

私はしたいが、機能に建ていずれかを使用していない...と、これは宿題ではありません:D

+7

これは宿題でない場合は、なぜ組み込み関数を使用したくないのですか? – marcog

+0

原因私は他の可能な方法でそれを行うことを学びたい – user531225

+0

組み込み関数のどのレベルを使いたいですか? '見つける'?スプリット?スライス演算子? – robert

答えて

3

あなたはこれを求めました。単語に分割する機能が必要です。ここにあります。 「単語」は空白で区切られていると仮定します。

組み込み関数はありません。インポートされたanythingsはありません。組み込み型のメソッドはありません。+=のようなパンティーウエストのものでもありません。それはテストされています。

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

すべては、1つの方法で機能で構築されので、私は、組み込みの関数を使いたくないという主張を無視するつもりです。

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

主な欠点は、句読点が含まれていることです。私はそれを取り除く方法を理解するための練習としてそれを残す。 :)それを行うには

7

明白な方法がある:

"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") 
+1

enumerate、isspace、stripはすべて組み込みです。 :)これはいかに愚かな参照してください参照してください? – marcog

+0

しかし、列挙は組み込みです。そしてisspace。そして==。そして[]。そして.... ....-) –

+0

上記を参照してください。しかし、私を去らせるための+1 ... "おい!私の頭!" (関連するノートでは、COBOLで数値のバイナリ文字列表現を抽出する方法は?-) –

1

最初に、私はコメントと他の答えに絶対に同意していると言いましょう。組み込み関数を使わないのは愚かです。つまり、の機能を組み込んだわずかなコードを使用してこのコードを書き込もうとすると、興味深い課題であるが呼び出されていることがわかりました。

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の場合、このコードは大したことに失敗します。

+0

thx ...私はこれを使うことができます。またはlen関数 – user531225

+0

クラーク:再帰関数呼び出しを使用するのはちょっとしたチートですね。 –

+0

彼は関数が組み込まれていない、私は再帰がそれに違反するとは思わないと言った。心配しないで、あなたの答えはまだ良いです:) –

関連する問題