我想要通过使用while循环添加一个空字典,以及我想使用相同循环迭代的字符串。我想要做的是通过使用一个字符来添加到字典中,作为键,在+ 1处作为值。从字符串读取时,如果循环遇到字典中已有的键,则会将 at 处的值添加到字典中已有的值。一旦达到字符串的长度,它就会停止 -
假设我给了字符串“Hello”来制作字典。理想情况下,我的循环将'H'作为第一个字母,然后使用'H'作为键创建一个条目,并使用'e'作为值。当谈到'l'时,它会创建一个以'l'为键,'l'为值的条目。然后,以“l”为键,“o”为值的条目。
到目前为止,这是我的功能。它不是从第0个索引开始,而是从第一个开始:
def add(self, word):
__first += word[0]
at = 0
while (at < len(word)-1):
__follow["""word[at] as the key"""] += word[at+1] #The next character as the value
at += 1
该行的正确语法是什么:
__follow["""word[at] as the key"""] += word[at+1]
答案 0 :(得分:1)
字符串可以用作字典键,因此您应该能够__follow[word[at]] += word[at + 1]
。但是,您还需要使用defaultdict
(docs):
import collections
__follow = collections.defaultdict(str)
如果您不这样做,则第一次尝试在不存在的密钥上附加到__follow
时将失败并显示KeyError
。使用defaultdict
,如果您访问尚不存在的密钥,您将获得(在本例中)一个空字符串。
顺便说一句,看起来你是一个班级方法。如果是这样,__first
和__follow
似乎应该是instance attributes,如果您希望它们是持久的。
答案 1 :(得分:0)
您还可以在一行中使用字典构造函数构造__follow
:
__follow = dict(zip(word[:-1], word[1:]))
我将通过这个示例字符串&#34; Hello&#34;。
word[:-1]
会给你一个字符串,但不包括最后一个字母。 word[1:]
将从第二个字母开始给你一个字符串并结束。这给你两个字符串&#39; Hell&#39;和&#39; ello&#39;。 zip
是一个python内置函数,它接受两个可迭代项并返回一个元组列表,将每个连续元素配对,因此zip(word[:-1], word[1:])
给出:
[('H', 'e'), ('e', 'l'), ('l', 'l'), ('l', 'o')]`
使用dict
直接调用字典构造函数,可以传入一个由zip
提供的元组列表,并生成一个字典,其中每个元组的第一个元素为key,第二个元素作为值。
将所有内容放在一起,dict(zip(word[:-1], word[1:]))
将为您提供一个类似于
{
'H': 'e',
'e': 'l',
'l': 'o'
}
请注意,这并不是完全你想要的东西,因为&#34;你好&#34;有两个&#39; l&#39;字符,但字典中的键必须是唯一的。你不能有两个&#39; l&#39;键指向不同的值。这意味着无论您选择哪种实施方式,当__follow['l']='o'
为&#34;您好&#34;
__follow['l']='l'
将覆盖上次出现的word
。{/ 1>