2017-10-15 78 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

相关问题