Python词典为键添加不同的值?

时间:2014-04-09 08:47:09

标签: python dictionary

我想创建一个遍历列表的函数,并为列表中的每个事物创建一个包含键的字典,并在键后面的列表中显示一个值。

def function(s : str) -> {str:{str}}:
    listt=list(s)
    dictt= {}
    for i in listt[:-1]:
        if i not in dictt:
            dictt[i] = set()
        dictt[i].update(listt[listt.index(i)+1])
    return dictt



print(function('bookeeper'))

应该返回:

{'b': {'o'}, 'k': {'e'}, 'p': {'e'}, 'o': {'o', 'k'}, 'e': {'e', 'p', 'r'}}

但实际上会返回:

{'b': {'o'}, 'k': {'e'}, 'p': {'e'}, 'o': {'o'}, 'e': {'e'}}

3 个答案:

答案 0 :(得分:3)

不要使用list.index();这只会匹配一封信的第一次次出现;对于'o',它永远不会找到第二个'o';你只会在集合中重复添加相同的字符。

使用enumerate()为循环添加索引,而不是:

def function(s : str) -> {str:{str}}:
    listt=list(s)
    dictt= {}
    for next_index, char in enumerate(listt[:-1], 1):
        if char not in dictt:
            dictt[char] = set()
        dictt[char].update(listt[next_index])
    return dictt

我从1开始enumerate()而不是默认值0,因此它始终代表 next 位置。

演示:

>>> def function(s : str) -> {str:{str}}:
...     listt=list(s)
...     dictt= {}
...     for next_index, char in enumerate(listt[:-1], 1):
...         if char not in dictt:
...             dictt[char] = set()
...         dictt[char].update(listt[next_index])
...     return dictt
... 
>>> print(function('bookeeper'))
{'p': {'e'}, 'o': {'o', 'k'}, 'e': {'p', 'r', 'e'}, 'b': {'o'}, 'k': {'e'}}

现在它正在运行,让我们稍微简化一下;例如,当密钥丢失时,使用dict.setdefault()将字符集添加到字典中。字符串已经是序列,无需将它们转换为列表:

def function(s : str) -> {str:{str}}:
    dictt = {}
    for next_index, char in enumerate(s[:-1], 1):
        dictt.setdefault(char, set()).update(s[next_index])
    return dictt

我们也可以使用enumerate()来配对单词的字母,而不是zip()

def function(s : str) -> {str:{str}}:
    dictt = {}
    for char, next_char in zip(s, s[1:]):
        dictt.setdefault(char, set()).update(next_char)
    return dictt

答案 1 :(得分:1)

您的问题是index()始终返回字符串中的第一个索引,因此您将反复向该集添加相同的字符。

尝试类似

的内容
def function(s : str) -> {str:{str}}:
    dictt = {}
    for pos, char in enumerate(s[:-1]):
        if char not in dictt:
            dictt[char] = set()
        dictt[char].update(s[pos+1])
    return dictt

答案 2 :(得分:1)

这是另一个答案:

def func(string):
    arr = set(string)
    res = {}
    for char in arr:
        index = [i for i in range(len(string)) if string[i] == char]
        temp = []
        for i in index:
            if i == len(string) - 1:
                continue

            temp.append(string[i + 1])

        if temp:
            res[char] = temp

    return res

func('bookeeper')

>>> {'b': ['o'], 'e': ['e', 'p', 'r'], 'k': ['e'], 'o': ['o', 'k'], 'p': ['e']}