在Python循环中调整迭代次数

2024-06-26 14:18:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个algo,它遍历一系列字符串,如果字符串满足某个条件,则将它们连接在一起,然后按连接的字符串数跳过,以避免重复计算相同连接字符串的部分。你知道吗

我知道I=I+x或I+=x不会改变每个循环的迭代次数,所以我正在寻找一种替代方法来跳过一个变量的多次迭代。你知道吗

背景:我试图创建一个命名实体识别算法,用于新闻文章。我将文本('Prime Minister Jacinda Ardern is from New Zealand')标记为('Prime','Minister','Jacinda','Ardern','is'...),并在其上运行NLTK词性标记算法,给出:…(('Jacinda','NNP'),('Ardern','NNP'),('is','VBZ')...,然后在后续单词也是“NNP”/专有名词时组合单词。你知道吗

我们的目标是将“Prime Jacinda Ardern”计算为1个字符串,而不是4个字符串,然后将循环迭代次数跳过尽可能多的单词,以避免下一个字符串是“Prime Jacinda Ardern”,然后是“Jacinda Ardern”。你知道吗

上下文: “text”是一个列表列表,通过标记我的文章,然后对其进行词性标记,其格式为:[...('She', 'PRP'), ('said', 'VBD'), ('the', 'DT'), ('roughly', 'RB'), ('25-minute', 'JJ'), ('meeting', 'NN')...] ‘NNP’=专有名词或地点/人员/组织等的名称

for (i) in range(len(text)):

    print(i)

    #initialising wordcounter as a variable
    wordcounter = 0

    # if text[i] is a Proper Noun, make namedEnt = the word. 
    # then increase wordcounter by 1
    if text[i][1] == 'NNP':
        namedEnt = text[i][0]
        wordcounter +=1

        # while the next word in text is also a Proper Noun,
        # increase wordcounter by 1. Initialise J as = 1
        while text[i + wordcounter][1] == 'NNP':
            wordcounter +=1
            j = 1


            # While J is less than wordcounter, join text[i+j] to 
            # namedEnt. Increase J by 1. When that is no longer
            # the case append namedEnt to a namedEntity list
            while j < wordcounter:
                namedEnt = ' '.join([namedEnt,text[i+j][0]])
                j += 1
            InitialNamedEntity.append(namedEnt)

        i += wordcounter

如果Iprint(i)在开始时,它一次增加1。当我打印由namedEnts组成的NamedEntity列表的计数器时,i结果如下: (...'New Zealand': 7, 'Zealand': 7, 'United': 4, 'Prime Minister Minister Jacinda Minister Jacinda Ardern': 3...)

因此,我不仅得到了“新西兰”和“新西兰”的双重统计,而且我还得到了像“总理雅辛达部长雅辛达阿登”这样古怪的结果。你知道吗

我想要的结果是('New Zealand':7, 'United States':4,'Prime Minister Jacinda Ardern':3)

任何帮助都将不胜感激。干杯


Tags: the字符串text标记newis单词prime
3条回答

如果需要调整for的递增方式,请不要使用i循环,因为它总是将其设置为范围中的下一个值。使用while循环:

i = 0
while i < len(text):
    ...
    i += wordcounter

range()创建一个iterable对象。for…in构造对其调用next方法,每次next都返回序列中的下一个值。所以i变量不是序列中的索引,它只是迭代器生成的下一个值。修改i没有效果,当从序列中检索到下一个值时,它将被覆盖。你知道吗

这与C中类似for (int i = 0; i < 5; i++) {}的循环非常不同,在C中没有序列的概念;它只是在执行块之前检查i是否小于5。你知道吗

比较一下:

for i in {2,-1,-4}:
  print(i)
  i = i + 2

也许这里更明显的是,设置我将没有任何影响。你知道吗

但是类似于C的构造,也可以在Python中实现。具体如下:

i = 0
while i < 6:
  print(i)
  if i == 2:
    i = i + 2
  else:
    i = i + 1

这个指纹

0
1
2
4
5

看到没有输出3了吗?当它达到i==2时,它加了2,所以跳过了3。您可以在代码中执行类似的操作。你知道吗

(这些示例是python3)

谢谢大家的帮助。我使用了Barmar显示的while循环:

i=0

而我<;len(文本):

i+=文字计数器

最后使用了if-else语句:

如果wordcounter>;0:i+=wordcounter

否则:i+=1

相关问题 更多 >