2016-12-06 114 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

您的教授要求您創建一個整數位置列表作爲字典的值,但是您的方法僅將整數值作爲值。因此,正確的方法是在循環中創建一個新列表,並在發現新位置時繼續追加。

相關問題