<p>一些评论提到了使用<code>list</code>作为变量名的危险。它实际上不是一个保留字,但它是一个内置类型的名称,如果您以后希望使用此类型来构造列表或测试对象的类型,那么使用它作为变量名来隐藏它可能会导致神秘的错误。在</p>
<p>您发布的代码的一个主要问题是:</p>
<pre><code>search1 = search.upper()
for search1 in list:
</code></pre>
<p>第一行将字符串<code>search</code>的大写版本保存到名称<code>search1</code>。但是下一行只是用<code>list</code>中的单词来删除它;它不执行任何搜索操作。在<code>for</code>循环的末尾,<code>search1</code>将等于<code>list</code>中的最后一个项目,这就是为什么您的代码在执行<code>position=list.index(search1)</code>时没有按照您的预期执行:您告诉它查找<code>list</code>中最后一个单词的位置。在</p>
<hr/>
<p>你可以用<code>.index</code>做你想做的事。要找到多个引用,需要使用循环并传递<code>.index</code>一个起始位置。例如</p>
^{pr2}$
<p>然而,在这里使用<code>.index</code>并没有什么好处。<code>.index</code>以C速度执行扫描,因此它比在Python循环中扫描要快,但是除非您要扫描的列表很大,否则您可能不会注意到太多的速度差异。在</p>
<p>托马斯兹的回答给出了更简单的方法。这是我在托马斯写答案时写的一个变体。在</p>
<pre><code>def ordinal(n):
k = n % 10
return "%d%s" % (n, "tsnrhtdd"[(n // 10 % 10 != 1) * (k < 4) * k::4])
def find_all(wordlist, word):
return [i for i, s in enumerate(wordlist, 1) if s == word]
sen = 'this has this like this'
wordlist = sen.upper().split()
words = 'this has that like'
for word in words.split():
pos = find_all(wordlist, word.upper())
if pos:
pos = ', '.join([ordinal(u) for u in pos])
else:
pos = 'Not found'
print('{0}: {1}'.format(word, pos))
</code></pre>
<p><strong>输出</strong></p>
<pre><code>this: 1st, 3rd, 5th
has: 2nd
that: Not found
like: 4th
</code></pre>
<p><code>ordinal</code>的代码是从<a href="https://stackoverflow.com/a/20007730/4014959">this answer</a>借来的。在</p>