2011-01-11 14 views
1

元気?forループのlookbehind

この問題はちょっと残念ですが、私はforループを使って 'ing'で終わり、INであるタグが先行しています。私はCとjavaのバックグラウンドから来ています簡単ですが、私はまだPythonでそれを行う方法を把握できません!

私の周りを検索し、ここで私は私が行う必要があると思うものです:

for word, tag in list: 
    if word.endswith('ing'): 
     //use regular expression here which should look like this '(?<=\bIN\b)ing' 

は今ofcourseのがいくつかの問題は、私は私が前のタグではない単語を調べる必要があり、正規表現まず、ありますおそらく間違っていて、もっと重要なのは、これはあまりにも複雑すぎるように思えます。私はここに何かを見逃しています。ただ、「ing」で終わる単語のインデックスを使用して、例えば??

は、事前にありがとうとごめんその場合は愚かな質問、その2度目のpythonを書いて、まだそれでさびていますしようとしている=)

EDITなどの:私が必要なものについての詳細説明ここでの例は解決しようとしているものですが、時にはpos_tagがVBGを名詞に間違えることがあるので、タグ付きリスト(例えば、( 'Cultivate'、 'NNP')、 (NN))は、この問題を訂正し、[( '耕作'、 '耕作'、 ' ( 'justice'、 'NN')])に注意してください。 bservingは

EDIT2が変更されています。問題は今解決し、ここでの解決策は、デフ(LI)の変換である:xrangeの中に私のため (LEN(LI)): 李場合は[I] [0] .endswithli [i] =(li [i]、 'VBG')

皆さんありがとうございました=ありがとうございました。それで

+2

実際に解決しようとしている問題は何ですか? –

+1

あなたの入出力が何であるかはあまり明確ではありません。なぜあなたのリストから2つの値を抽出していますか?それはタプルのリストですか?また、変数名 'list'を使って組み込み関数リストをオーバーライドしないでください。 – Falmarri

+0

入力と対応する出力のサンプルを表示してみてください。 –

答えて

1

あなたのコメントに基づいて、これは欲しいと思う:

def transform(li): 
    new_li = [] 
    prev_tag = None 
    for word, tag in li: 
     if word.endswith('ing') and prev_tag == 'NN': 
      tag = 'VBG' 
     new_li += [(word, tag)] 
     prev_tag = tag 
    return new_li 

また、その場でこれを行うことができます:私はlilistに改名

def transform(li): 
    for i in xrange(len(li)): 
     if li[i][0].endswith('ing') and i > 0 and li[i-1][1]: 
      li[i] = (li[i], 'VBG') 

注意。 listはPythonリストの型名です。それを上書きするのは悪い考えです。

+0

変換は前の単語のタグをどう見ていますか?誤解されていない場合、単語がingで終わり、その前のタグではないタグが ' NN '、私は単語のタグではなく、前のタグを見る必要があります – r3x

+0

@AnH申し訳ありませんが、私は今まであなたの最後のコメント(それをクリア)を見ていない。私は今回あなたを理解したと思いますか? – marcog

+0

gr8 =)もし私が何を意味するのかまだ分かっていないなら、お気軽にお聞かせください。私はもう一度それを説明するか、別の例を与えるために最善を尽くすつもりです.Liと上書きリスト= D – r3x

0
previousWord = "" 
previousTag = "" 

for word, tag in list: 
    if word.endswith('ing'): 
     //use regular expression here which should look like this '(?<=\bIN\b)ing' 
     //use previousWord and previousTag here 
    previousWord = word 
    previousTag = tag 
0

あなたの解決策は、あなたのリストのデータのペアとして不変のタプルを持つことによっていくらか動かされます。あなたは何千または数百万を持っている場合、これはあなたのデータおよびあなたがコントロールするあなたのフォーマットであれば、...やや無駄なあなたを

li=[('Cultivate', 'NNP'), 
    ('peace', 'NN'), 
    ('by', 'IN'), 
    ('observing', 'NN'), 
    ('justice', 'NN')] 

lnew=[]  

for word, tag in li: 
    if word.endswith('ing') and tag == 'NN': 
     tag='VBG' 
    lnew.append((word,tag)) 

for word, tag in lnew: 
    print word, tag 

:最も簡単な方法は、あなたがトータルにする新しいリストを作成することですタプルのリストの代わりに辞書を使うことを検討したいかもしれません。そして、あなたは代わりに、より自然にして変更による辞書ループすることができます

ld={'justice': 'NN', 'Cultivate': 'NNP', 'peace': 'NN', 
    'observing': 'NN', 'by': 'IN'} 

for word, tag in ld.items(): 
    if word.endswith('ing') and tag == 'NN': 
     ld[word]='VBG' 

大きなデータセットでは、辞書のアプローチは、より速く、より多くのメモリ効率的です。それを考えてください。

+0

ありがとうございましたが、すでに答えを見つけてくれてありがとうございます。) – r3x

1

これは、場所の変更が

for index,(word, _tag) in enumerate(li): 
    if word.endswith('ing') and i > 0 and li[index-1][1] == 'IN': 
     li[index] = word, 'VBG' 

列挙では、foreachの形式でリストを反復することを可能にするだけでなく、現在のインデックスへのアクセスを取得ありません。私はそれが大好きですが、あまりにも多すぎると心配して、代わりにfor i in xrange(10): ...のようなものを使うべきです。

+0

ありがとうございますthats helpful =) – r3x