在for循环中看后面

时间:2011-01-11 22:37:32

标签: python regex

你好吗?

我有点坚持这个问题,我需要使用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'

现在当然有一些问题,首先我需要查看前一个标签而不是单词,正则表达式可能是错误的,更重要的是这听起来太复杂了,我在这里遗漏了一些东西,有没有方法只是使用以'ing'结尾的单词的索引来查看它后面的标记,就像我用java做的那样?

提前感谢您,如果这是一个愚蠢的问题,请对不起,就像我第二次尝试编写python并且仍然生锈它=)

编辑 :关于我需要做什么的更多解释,这里的一个例子是我想要解决的问题,有时pos_tag会错误地将VBG作为名词,所以我需要编写一个给出标记列表的方法(例如[('Cultivate','NNP'),('peace','NN'),('by','IN'),('observing',' NN'),('正义','NN')]纠正了这个问题并返回[('培养'','NNP'),('和平','NN'),('by','IN'), ('观察',' VBG '),('正义','NN')])注意观察如何变化

EDIT2 :问题现在解决了,这里是解决方案def transform(li):     for x in xrange(len(li)):         如果li [i] [0] .endswith('ing')和i&gt; 0和li [i-1] [1]:             li [i] =(li [i],'VBG')

谢谢你们所有人的帮助= D赞赏它

4 个答案:

答案 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

您也可以就地执行此操作:

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重命名为lilist是Python列表的类型名称,覆盖它是一个坏主意。

答案 1 :(得分: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'

enumerate允许您以foreach方式迭代列表,但也可以访问当前索引。我非常喜欢它,但我有时会担心如果我过度使用它而应该使用类似for i in xrange(10): ...的东西。

答案 2 :(得分: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

答案 3 :(得分: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'

在大型数据集中,字典方法更快,内存效率更高。考虑一下。