以下是问题:
使用以下输入和输出编写名为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'?
的多个位置答案 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)
你的教授要求你创建一个整数位置列表作为字典的值,但是你的方法只将整数作为值。因此,正确的方法是在循环中创建一个新列表,并在找到新位置时继续追加该列表。