Python:在字符串中获取以下字母,并在字典中用作键值

时间:2015-01-10 23:26:36

标签: python python-3.x dictionary

让我们说例如我有一个字符串“尝试”,我想把它分解成一个字典来存储一个字母作为键,以下字母作为列表中的值。 所以我通过函数传递包含'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中

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']}

注意:单词中的最后一个字符也在字典中,即使其列表一般可能为空。