2017-10-15 73 views
0
text = "This is a test for my program" 
new_dict = {} 
text_list = text.split() 

word_tester = 2 
for word in text_list: 
    word_tester = len(word) 
    if len(word) == word_tester: 
     new_dict[word_tester] = word 

return new_dict 

我想建立一個Python程序,通過字符串的例子不勝枚舉,並將它們分配到一個字典,其中的關鍵是字符的數量該字符串和值是該字本身 (例如:2:是,到3:富,酒吧)。然而,我的程序只會經過並分配一些給定的字符串列表。我能做些什麼才能使這個工作?Python的 - 遍歷整個列表並將其分配給一個字典

+2

字典只能爲每個鍵保存一個值,但這個值本身可以是例如一個列表。 –

+2

我沒有看到'word_tester'以及內部的'if'這一點。也許你錯過了你目前只處理2個單詞的事實? – alfasin

+0

你的代碼有一個問題,就是你有'word_tester = len(word)'緊接着'if len(word)== word_tester'。在這種情況下,'len(word)'將始終等於'word_tester',因爲您剛剛在前一行中使它們相等!您可能想使用另一個變量來跟蹤字長。 – avigil

回答

0
#1 

text = "This is a test for my program" 
final_dct = {len(word):word for word in text.split() if len(word)==len(word_tester)} 

#2 
text = "This is a test for my program" 
new_dict = {} 
text_list = text.split() 


for word in text_list: 
    if len(word) in new_dict and word not in new_dict[len(word)]: 
     new_dict[len(word)].append(word) 
    else: 
     new_dict[len(word)] = [word] 

return new_dict 
0

我想,這將是非常簡單的:

for word in text_list: 
    new_dict[len(word)] = word 

注意,在本字典,關鍵4被分配到測試,沒有這一點,因爲只有一個值可以爲每個按鍵分配。要在這種情況下使值列表,您可以使用:

for word in text_list: 
    if len(word) in new_dict: 
     new_dict[len(word)].append(word) 
    else: 
     new_dict[len(word)] = [word] 
+0

這將只保留最後的字長髮生。所以new_dict會有'我的'並跳過'是'。 – skrubber

+0

正確...我正在處理...不清楚OP的期望,但我假設在這種情況下的列表 – kbball

+0

@Mokshyam確定它應該現在修復 – kbball

1

我認爲你只需要確保在空間上拆分。我跑這個,它的作品。

text = "This is a test for my program" 
text_list = text.split(" ") 
new_dict = {} 
for word in text_list: 
    if len(word) in new_dict and word not in new_dict[len(word)]: 
     new_dict[len(word)].append(word) 
    else: 
     new_dict[len(word)] = [word] 

#print(new_dict) 
#{1: ['a'], 2: ['is', 'my'], 3: ['for'], 4: ['This', 'test'], 7: ['program']} 
return new_dict 
+0

我不認爲你需要檢查這個單詞是否在new_dict中,但是如果你關心重複的話,你基本上打敗了我+1 – kbball

+0

,使用'set'而不是'list'和'add'而不是'append'會讓你在沒有檢查的情況下處理這個問題 – avigil

0

問題是一個鍵只能有一個值,所以每當你有一個給定長度的單詞時,它就會覆蓋它。要解決這個問題,您可以將字符串列表存儲爲字典值而不是單個字符串,如另一個示例中所示。

collections模塊中的一個便利的工具是defaultdict,它可以讓您定義一個默認條目,如果一個鍵還沒有一個值。一個常見的用例是使用defaultdict(list)以空列表開始鍵。這使您不必檢查密鑰是否不存在,並手動將其初始化爲空列表。結合這個例子,你會得到:

from collections import defaultdict 

text = "This is a test for my program" 
new_dict = defaultdict(list) # a dictionary whose default value is an empty list 
text_list = text.split() 

for word in text_list: 
    # append this word to the list of words with the same length 
    new_dict[len(word)].append(word) 

return new_dict 
+0

如果你不關心存儲重複項,你可以使用'set'來存儲唯一的單詞:用'defaultdict(set)'和'new_dict'替換'defaultdict(list) len(word)]。append(word)'加上'new_dict [len(word)] .add(word)'。您可以使用相同的字符串多次調用'add',並且只有一個實例將被存儲在集合中。 – avigil

相關問題