句子中单词的位置不能正常工作

Positions of words within a sentence not working properly

我的代码有问题:

def sentence_recreation(grammar_choice, sentence):
    new_sentence=''
    for char in sentence:
        if char not in grammar_choice:
            new_sentence=new_sentence + char
            sentence_list=new_sentence.split()
    compression(sentence_list)

def validation(sentence):
    if sentence=='':
        print('Input invalid. Please enter a sentence: ')
        compress_sentence()
    else:
        grammar_choice = input("Would you like to remove any punctuation or numbers in your sentence?('None', 'Both', 'Punctuation' or 'Numbers'): ")
        grammar_choice.lower()
        both=('''!()-[]{};:'"\,<>./?@#$%^&*_~0123456789''')
        punctuation=('''!()-[]{};:'"\,<>./?@#$%^&*_~''')
        numbers=('0123456789')
        #These if statements decide to remove: nothing, punctuation, numbers or punctuation and numbers
        if grammar_choice=='':
            print('Input invalid. Please try again.')
            validation(sentence)
        if grammar_choice=="none":
            sentence_list=sentence.split()
            compression(sentence_list)
        elif grammar_choice == "punctuation":
            grammar_choice = punctuation
            sentence_recreation(grammar_choice, sentence)
        elif grammar_choice == "numbers":
            grammar_choice = numbers
            sentence_recreation(grammar_choice, sentence)
        elif grammar_choice == "both":
            grammar_choice = both
            sentence_recreation(grammar_choice, sentence)
        else:
            print('Input invalid. Please try again.')
            validation(sentence)

def compression(sentence_list):
    words=[]
    positions=[]
    y={}
    #This enumerate function allows the program to create two lists with the unique words as well as the positions of those words within the sentence
    for i,x in enumerate(sentence_list):
        if x in y:
            positions.append(y[x])
        else:
            y[x]=i
            positions.append(i)
    for i,x in enumerate(sentence_list):
        if sentence_list[i] not in words:
            words.append(sentence_list[i])
    print(words)
    print(positions)
    file=open('positions and words.txt','w')
    file.write(str(words))
    file.write(str(positions))
    file.close
    print('Goodbye')
    import sys
    sys.exit()

def compress_sentence():
    sentence=input('Please enter your desired sentence: ')
    validation(sentence)

compress_sentence()

当输出单词在句子中的位置时,由于某些原因它似乎不起作用,例如:

>>> 
Please enter your desired sentence: When you crack the code, you don't just crack the code, you crack all the codes 1.048596
Would you like to remove any punctuation or numbers in your sentence?('None', 'Both', 'Punctuation' or 'Numbers'): none
['When', 'you', 'crack', 'the', 'code,', "don't", 'just', 'all', 'codes', '1.048596']
[0, 1, 2, 3, 4, 1, 6, 7, 2, 3, 4, 1, 2, 13, 3, 15, 16]
Goodbye
>>> 

程序应该输出位置 [0,1,2,3,4,1,5,6,2,3,4,1,2,7,3,8,9] 然而它才不是。我真的很感谢您的帮助,因为我不确定我必须做些什么来修复它,而且我对它为什么这样做有一个模糊的想法。

这是您问题的根源:

positions.append(i)

这是追加枚举函数的索引,它追加每个唯一单词的原始位置,因此数量不断增加。您想要做的是为每个新术语增加一个。这可以通过将该行更改为以下内容来完成:

positions.append(len(y) -1)

输出:

Please enter your desired sentence:  When you crack the code, you don't just crack the code, you crack all the codes 1.048596
Would you like to remove any punctuation or numbers in your sentence?('None', 'Both', 'Punctuation' or 'Numbers'):  none
['When', 'you', 'crack', 'the', 'code,', "don't", 'just', 'all', 'codes', '1.048596']
[0, 1, 2, 3, 4, 1, 5, 6, 2, 3, 4, 1, 2, 7, 3, 8, 9]
Goodbye