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

时间:2016-12-06 03:50:29

标签: python string python-3.4

以下是问题:

使用以下输入和输出编写名为wordPositions()的函数。 输入:s,由大写和小写字母和空格组成的字符串。 返回:一个字典,其中s中的每个不同的单词是一个键,相应的值是单词出现的s中的位置列表。无论资本化程度如何,单词都应视为相同。也就是说,"是"和"是"是同一个词。 以下是正确输出的示例。

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

wp = wordPositions(s) 

print(wp) 
  

{' two':[2],' one':[0],' red':[4],' fish&#39 ;:[1,3,5,7],'蓝色':[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,&# 39;一个':0}

如何让它看起来像教授一样?另外,请注意我的输出中的“fish' fish”字样。虽然它在字符串中重复,但只显示了它的一个位置。我如何让Python显示' fish'?

的多个位置

4 个答案:

答案 0 :(得分:4)

每当您找到单词的位置并存储它时,您将覆盖该键的值(如果之前找到该单词),而不是为其添加其他值。

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

首先,您需要检查字典中是否已存在密钥。如果没有,请先为该键指定一个空数组。然后(无论密钥是否先前存在)将新值推送到数组(即,作为该密钥值的数组)。

修改:另请注意position = words.index(item)获取该字首次出现的位置。因此,您需要确保单词的位置不重复(提示:使用for循环来执行此操作)。

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

编辑2 (根据@ TigerhawkT3评论):在enumerate循环中使用for。在这种情况下使用更简单。 (谷歌python枚举)。

注意:我故意不在此处发布代码。只是(希望是有帮助的)指示。看起来你应该试图找出适合自己的东西。 : - )

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

Pythonic方式可能是以下字典理解:

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在评论中指出的那样,从复杂的角度来看,这个解决方案并不是一个好的解决方案,因为它是一个O(n ^ 2)(嵌入在循环内部的列表上的一个循环)设定)。

虽然它看起来不错,但因为它是一个使用字典和列表理解的Pythonic解决方案。

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

答案 3 :(得分:0)

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