Python 如何找到单词在字符串中的位置?

Python 如何找到单词在字符串中的位置?,python,string,python-3.4,Python,String,Python 3.4,问题是: 使用以下输入和输出编写一个名为wordPositions的函数。 输入:s,由大小写字母和空格组成的字符串。 Return:一种字典,其中s中的每个不同单词都是一个键,对应的值是该单词在s中出现的位置列表。无论大写与否,单词都应被视为相同的词。也就是说,Yes和Yes是同一个词。 以下是正确输出的示例 s = 'One fish two fish red fish blue fish' wp = wordPositions(s) print(wp) {'two':[2],'

问题是:

使用以下输入和输出编写一个名为wordPositions的函数。 输入:s,由大小写字母和空格组成的字符串。 Return:一种字典,其中s中的每个不同单词都是一个键,对应的值是该单词在s中出现的位置列表。无论大写与否,单词都应被视为相同的词。也就是说,Yes和Yes是同一个词。 以下是正确输出的示例

s = 'One fish two fish red fish blue fish' 

wp = wordPositions(s) 

print(wp) 
{'two':[2],'one':[0],'red':[4],'fish':[1,3,5,7],'blue':[6]}

下面是我的代码:

def wordPositions(s):
aDict = {}
words = s.split(' ')
for item in words:
    position = words.index(item)
    aDict[item] = position
print(aDict)
print(wordPositions('One fish two fish red fish blue fish'))
问题是我的输出:

{'two':2,'blue':6,'red':4,'fish':1,'One':0}


我怎么才能让它看起来像教授的?另外,请注意,在我的输出中,“fish”一词只显示它的一个位置,尽管它在字符串中重复出现。如何让Python显示“fish”的多个位置?

每次您找到一个单词的位置并存储它时,如果之前找到了该单词,您将覆盖该关键字的值,而不是向其添加另一个值

不要将位置值直接指定给字典项。相反,您需要为每个字典项分配一个数组。然后,每次找到单词的位置时,都可以将新值推送到数组中

首先,您需要检查字典中是否已经存在密钥。如果不是,则首先为该键分配一个空数组。然后,无论键以前是否存在,都会将新值推送到数组上,即该键的值所在的数组

编辑:还要注意position=words.indexitem获取该项在word中第一次出现的位置。因此,您需要确保单词的位置不是重复的提示:使用for循环来执行此操作

向发送上述编辑的@Cham K.道歉-我不确定如何自动接受它

根据@TigerhawkT3注释编辑2:在for循环中使用枚举。使其在这种情况下更易于使用。谷歌python枚举

注意:我故意不在这里发布代码。只是希望有帮助的指示。看起来你应该自己去弄清楚-

试试这个:

def wordPositions(s):
    aDict = {}
    words = s.split(' ')
    for item in words:
        aDict[item]=""
    for i in range(0,len(words)):
        if aDict[words[i]]=="":
            aDict[words[i]]=str(i)
        else:
            aDict[words[i]] = aDict[words[i]]+","+str(i)
    print(aDict)
wordPositions('One fish two fish red fish blue fish')

python方法可以是以下词典理解:

def wordPositions(s):
    splitted = s.split()
    return {w: [i for i in range(len(splitted)) if splitted[i] == w]
                for w in set(splitted)}
正如BallpointBen在评论中指出的那样,从复杂性的角度来看,这个解决方案不是一个好的解决方案,因为它是嵌入在集合上的循环中的列表上的一个On^2 one循环

尽管如此,它看起来还是不错的,因为它是一个Pythonic解决方案,同时使用字典和列表理解


要学习的是,Pythonicity是好的,但不是每次都好。

你的教授要求你创建一个整数位置列表作为字典的值,但是你的方法只将整数作为值。因此,正确的方法是在循环中创建一个新列表,并在找到新位置时继续追加该列表。

我还建议推荐enumerate。@TigerhawkT3是的。如果字符串中的每个单词总是用空格隔开,那就是我会采取的方法。我想你是在开玩笑,你并不是真的要求别人帮你做作业。另请查看和@Jorgan如果这件事在午夜到期,为什么不早点做呢?@Jorgan不太乐意帮忙,希望别人做你的工作不是这样做的目的。请注意,这是在^2上,而最佳解决方案是在^2上。@BallpointBen我知道这一点:我认为这在复杂性和可读性方面都不好,但这仍然是一种蟒蛇式的方式。事实上,我发布这个答案是为了指出处理这些问题的理解方式。很好!我想知道教授是否能理解那个?你是说,那个线索?字典理解中的列表理解。还有这整条线-你的字典需要有列表。对于这一个,您可能希望查看defaultdict,以允许您的字典条目默认为列表。下一步是使用enumerate进行迭代。如果您使用的索引没有起始参数,它将继续查找相同的索引,更不用说它将使代码的时间复杂度达到^2。为我考虑,单词中列举了“一条鱼,两条鱼,红鱼,蓝鱼”。