2011-01-11 184 views
1

你好嗎?lookbehind in for循環

有點卡住這個問題,我需要使用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'結尾的單詞的索引來查看它背後的標籤,就像我會使用java例如??

謝謝你提前和對不起,如果它是一個愚蠢的問題,它就像我的第二次嘗試編寫Python和我仍然生疏吧=)

編輯:什麼,我需要更多的解釋這樣做,這裏的一個例子是我試圖解決,有時pos_tag失誤VBG的名詞,所以我需要寫一個給定的一個標記列表(例如[(「培養」,「NNP」),(」的方法('''',''''),('觀察','NN'),('正義','NN')]糾正了這個問題並返回了[('Cultivate',' NNP '),(' 和平」, 'NN'),( '通過', 'IN'),( '觀察', 'VBG '),(' 正義', 'NN')])注意如何Ø bserving已經改變

EDIT2:現在問題解決了,這裏是溶液DEF變換(LI): 爲i的x範圍(LEN(LI)): 如果利[I] [0] .endswith ('ing')和i> 0和li [i-1] [1]: li [i] =(li [i],'VBG')

謝謝各位的幫助=它

+2

你有什麼問題*實際上*試圖解決? – 2011-01-11 22:40:51

+1

這是不是很清楚你的輸入/輸出是什麼。你爲什麼從你的列表中提取2個值?它是元組列表嗎?您也不應該使用變量名`list`,因爲它會覆蓋內置函數列表 – Falmarri 2011-01-11 22:42:09

+0

嘗試顯示輸入和相應輸出的示例。 – 2011-01-11 22:43:23

回答

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 

你也可以做到這一點就地:

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') 

注意,我改名listlilist是Python列表的類型名稱並覆蓋它是一個壞主意。

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' 

在大型數據集,字典的方法是更快,更高效的內存。考慮一下。

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): ...的東西。