为什么我的代码打印出18而不是10,你能提供任何解决方案吗?

时间:2016-05-06 13:54:05

标签: python python-3.x

我对python比较陌生,刚刚开始在学校学习,我们已经完成了一项任务,它要求你得到一个句子并把它变成一个单词列表。

例如:'不要问你的国家可以做什么,因为你问你可以为你的国家做什么'将被重建为[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 9, 6, 7, 8, 4, 5]

但是这个例子没有说明如果你在最后添加了一个新单词会发生什么,而且如果我要使用这个例子,我的老师要求我将最后一个单词显示为“10”。

例如:'不要问你的国家可以做什么,因为你问你可以为你的国家马铃薯做什么'。在我的代码中,它输出为[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 9, 6, 7, 8, 4, 5, 18]

我的问题很简单:

为什么代码确实这样做,为什么不将它打印为10而不是18?

您是否可以对我的代码进行任何可能的修改,并可能向我展示,但也解释它是如何工作的?

以下是我正在使用的代码。

sentence = input("Please input a sentence that you want to find the locations of all words: ")
words = sentence.split()
print([words.index(s)+1 for s in words])

3 个答案:

答案 0 :(得分:2)

在您的句子中,列表变为:

['ASK', 'NOT', 'WHAT', 'YOUR', 'COUNTRY', 'CAN', 'DO', 'FOR', 'YOU', 'ASK', 'WHAT', 'YOU', 'CAN', 'DO', 'FOR', 'YOUR', 'COUNTRY', 'POTATO']

POTATO是第18个元素。您应该创建一个没有重复项的新列表:

singles = []
for word in words:
    if word not in singles:
        singles.append(word)

然后,您可以使用singles.index(word)代替words.index(word)。更好的是:

used = {}
index = 0
for word in words:
    if word in used:
        print(used[word])
    else:
        index += 1
        print(index)
        used[word] = index

是的,它更长,但效率更高。

答案 1 :(得分:1)

所以这是你的单词列表,以马铃薯为例:

>>> y = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY POTATO"
>>> words = y.split()
>>> print([words.index(s)+1 for s in words])
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 9, 6, 7, 8, 4, 5, 18]

它打印'18'的原因是之前没有出现过“马铃薯”这个词,而且词汇列表中有18个项目:

>>> for word_number, word in enumerate(words):
...     print(word_number+1, word)
...
1 ASK
2 NOT
3 WHAT
4 YOUR
5 COUNTRY
6 CAN
7 DO
8 FOR
9 YOU
10 ASK
11 WHAT
12 YOU
13 CAN
14 DO
15 FOR
16 YOUR
17 COUNTRY
18 POTATO

index()首次在列表中找到该项时返回。之前的句子中没有马铃薯,所以返回最后一个索引,即17 + 1。

答案 2 :(得分:1)

问题

您期望您的代码在不计算重复单词的情况下为您提供单词索引,但您只需在原始字符串中获得单词index。

解决方案

首先,您需要在原始字符串中获取唯一字词,以便根据需要获得正确的单词索引 。您可以尝试demo here。使用Potato额外字,它返回索引 10 而不是 18 ,因为它在唯一列表中查找它,而不是原始列表。< / p>

string = 'ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY POTATO'
words = string.split()
unique_words = []

#Remove the duplicates while preserving order
for word in words:
    if word not in unique_words:
        unique_words.append(word)

#Generate the indexes for the words
indexes = [unique_words.index(word)+1 for word in words]
print(indexes)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 9, 6, 7, 8, 4, 5, 10]