index()的替代品

时间:2016-03-24 14:22:36

标签: python

因此,对于我的项目,我必须允许用户输入一个句子,然后输入一个单词并查找单词的所有内容并打印数字。这就是我所拥有的

    found = 0

sen = input("Enter the sentence you would like to break down!")
sen1 = sen.upper()
list = sen1.split()


search=input("Enter the word you want to search")
search1 = search.upper()
for search1 in list:
    found = found + 1

position=list.index(search1)



if position == 0:
    print("First word in the sentence")
if position == 1:
    print("Second word in the sentence")
if position == 2:
    print("Third word in the sentence")
if position == 3:
    print("Fourth word in the sentence")
if position == 4:
    print("Fifth word in the sentence")
if position == 5:
    print("6th word in the sentence")

else:
    position1 = position + 1
    print(position1, "th word in the sentence")

但它只打印出第一次出现的单词而且很少有效。任何解决方案?

3 个答案:

答案 0 :(得分:2)

list替换为a_list

search1出现的位置列表:

positions = [idx for idx, el in enumerate(a_list) if el == search1]

答案 1 :(得分:0)

你有一个很好的选择,就是re.finditer:

import re
sen = input("Enter the sentence you would like to break down!")
search = input("Enter the word you want to search")
for match in re.finditer(search, sen):
    print (match.start())

答案 2 :(得分:0)

有几条评论提到使用list作为变量名称的危险。它实际上并不是一个保留字,但它内置类型的名称,如果你以后希望将它作为变量名用它来遮蔽它会导致神秘的错误使用此类型构造列表或测试对象的类型。

您发布的代码存在的主要问题是:

search1 = search.upper()
for search1 in list:

第一行将字符串search的大写版本保存到名称search1。但是下一行简单地用list中的单词表示咒骂;它不执行任何搜索操作。在for循环结束时,search1将等于list中的最后一项,这就是为什么您的代码没有按照您的预期进行操作的原因当它执行position=list.index(search1)时:你告诉它找到list中最后一个单词的位置。

可以使用.index做你想做的事。要查找多个出现,您需要使用循环并将.index作为起始位置。例如,

def find_all(wordlist, word):
    result = []
    i = 0
    while True:
        try:
            i = wordlist.index(word, i) + 1
            result.append(i)
        except ValueError:
            return result

然而,在这里使用.index确实没什么好处。.index以C速度执行扫描,所以它比在Python循环中扫描要快但是你除非您扫描的列表很大,否则可能不会注意到速度差异。

更简单的方法是在Tomasz的答案中给出的。这是我在Tomasz撰写答案时写的一个变体。

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))

<强>输出

this: 1st, 3rd, 5th
has: 2nd
that: Not found
like: 4th      

ordinal的代码是&#34;借来的&#34;来自this answer