让我们说例如我有一个字符串“尝试”,我想把它分解成一个字典来存储一个字母作为键,以下字母作为列表中的值。 所以我通过函数传递包含'attempt'的字符串,并让函数返回一个类似于
的字典{'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'}
我如何从概念上做这件事?
*这是在python 3中
答案 0 :(得分:2)
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
会为您创建一个字典,当您访问其中一个项目/值时,looknext[char]
例如会自动使用list
(或default_factory
try:
looknext[char].append(s[index+1])
except KeyError:
looknext[char] = [s[index+1]]
初始化该值如果尚未访问该值,则传递给它的构造函数)。它在功能上等同于:
{{1}}
答案 1 :(得分:0)
这是一个解决方案:
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中对此进行了测试,但afaik在3.x
中应该完全相同答案 2 :(得分:0)
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']}
注意:单词中的最后一个字符也在字典中,即使其列表一般可能为空。