2016-12-06 111 views
-5

这里是问题:如何找到字符串中的单词的位置?

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

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

wp = wordPositions(s) 

print(wp) 

{ '2':[2], '一':[0], '红':[4], '鱼':[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')) 

的问题是我的输出:

{' 两化“:2, '蓝':6, '红':4 ,'fish':1,'One':0}

如何让它看起来像教授的?另外,请注意,在我的输出中,'fish'这个单词只显示了它的一个位置,尽管它在字符串中重复了一遍。我如何让Python显示'鱼'的多个位置?

+0

你的字典需要保存列表。对于这一个,你可能想看看'defaultdict'来让你的字典条目默认为列表。接下来的事情是迭代使用'枚举'。如果你使用索引(没有'start'参数),它会继续找到相同的索引,更不用说它会给你的代码'On^2'的时间复杂度。考虑'为我,在枚举字('一条鱼两条鱼红色鱼蓝色fish'.split()):打印(我,单词)' –

回答

4

每次找到某个单词的位置并将其存储时,都会覆盖该单词的值(如果该单词之前找到该单词),则不会向其中添加其他值。

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

首先,您需要检查密钥是否已存在于字典中。如果不是,请首先为该密钥分配一个空数组。然后(不管键是否存在)将新值推送到数组(即,作为该键的值的数组)。

编辑:另请注意,position = words.index(item)获得单词中第一次出现的位置。因此,您需要确保单词的位置不重复(提示:使用for循环来执行此操作)。

(道歉@Cham K.谁发送了上述编辑 - 我不确定如何自动接受)

编辑2(按照@ TigerhawkT3评论):使用enumeratefor循环。在这种情况下使用起来更简单。 (谷歌python枚举)。

注意:我故意不在这里发布代码。只是(希望有帮助)说明。看起来你应该试图找出自己的一些东西。:-)

+1

我也建议推荐'枚举'。 – TigerhawkT3

+0

@ TigerhawkT3是。如果字符串中的每个单词总是被空格分开,那就是我要采用的方法。 –

+1

我假设你是在开玩笑,而你并不是真的要求其他人为你做功课。另见http://meta.stackexchange.com/questions/18242/what-is-the-policy-here-on-homework和http://meta.stackoverflow.com/questions/334822/how-doi-i-问及答案 - 作业 - 问题 –

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

一个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,该解决方案是不是从一个好复杂性的观点,因为它是一个O(n^2)(嵌套在循环内的列表上的一个循环)。

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

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

+0

请注意,这是O(n^2),而最佳解决方案是O(n)。 – BallpointBen

+0

@BallpointBen我知道这一点:)我认为它在复杂性和可读性方面都很差,但它仍然是一种pythonic方式。其实,我发布了这个答案,指出了解决这些问题的理解方式。 –

+0

不错!我想知道教授是否可以效仿? –

0

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

相关问题