我对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])
答案 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]