Python:获取字符串中的以下字母作为字典中的键值

Python: Get the following letters in a string and use as key value in dictionary

例如,我有一个字符串 "attempt",我想将它分解成一个字典,将一个字母存储为键,将后面的字母存储为列表中的值。 所以我通过一个函数传递包含 'attempt' 的字符串,并让函数 return 成为一个看起来像

的字典
{'a': ['t'], 'm': ['p'], 'e': ['m'], 't': ['t', 'e'], 'p': ['t']}

他们最远我能到达的是

def convert(something):
    dictionary = {}
    for j in range(len(something)):
        if something[j] not in dictionary.keys():
            if i+1 < len(s):
                dictionary[something[j]] = something[j+1]
    return dictionary

但这还差得远,因为输出开始看起来像

{'a': 't', 't': 't', 'm': 'p', 'e': 'm', 'p': 't'}

我将如何在概念上进行此操作?

*这是在python3

Defaultdict 将很好地满足您的目的:

from collections import defaultdict
looknext = defaultdict(list)
s="attempt"
for index, char in enumerate(s[:-1]):
    looknext[char].append(s[index+1])
looknext  # looks like: defaultdict(<type 'list'>, {'a': ['t'], 'm': ['p'], 'e': ['m'], 't': ['t', 'e'], 'p': ['t']})

它是如何工作的(根据评论中的要求): defaultdict 会为你制作一本字典,当你访问其中一个 items/values、looknext[char] 时,例如,会自动用 list (或任何 default_factory 你传递给它的构造函数),如果这个值还没有被访问过。它在功能上等同于:

try:
    looknext[char].append(s[index+1])
except KeyError:
    looknext[char] = [s[index+1]]

这是一种解决方案:

string = 'attempt'

dic = dict([(letter,[]) for letter in string[:-1]])

这给了我们

>>> dic
{'a': [], 'm': [], 'e': [], 't': [], 'p': []}

这利用了字典定义会覆盖重复键的事实,因此每个字母只能出现一次。现在你有一堆空列表,然后用适当的内容填充它们...

for i in range(len(string)-1):
    dic[string[i]].append(string[i+1])

... 通过追加(不关心列表中是否已有内容)。这也将保持列表中字母的顺序不变。

可能有一个更优雅的解决方案,它只使用一个循环,或者至少也用隐式公式替换第二个循环 - 但应该这样做。

注意:我在 Python 2.7 中对此进行了测试,但据我所知,它在 3.x

中应该完全相同
word = 'attempt'
d = {c: [] for c in word}
for current, next in zip(word, word[1:]):
    d[current].append(next)
# -> {'a': ['t'], 'e': ['m'], 'm': ['p'], 'p': ['t'], 't': ['t', 'e']}

注意:单词的最后一个字符也在字典中,即使它的列表通常为空。