Python - 使用字符串添加到字典

时间:2014-12-03 19:21:52

标签: python dictionary

[Python 3.4.2]
我知道这个问题听起来很荒谬,但我无法弄清楚我在哪里弄乱。我正在尝试使用字符串而不是引用文本将字符串和值添加到字典中。所以,而不是这个,

dict['key'] = value

这样:

dict[key] = value

当我运行上面的命令时,我收到此错误:

TypeError: 'str' object does not support item assignment  

我认为Python正在考虑我正在尝试创建一个字符串,而不是添加到字典中。我猜我用的是错误的语法。这就是我想要做的事情:

dict[string_for_key][string_for_value] = string_for_deeper_value  

我希望这个^命令执行此操作:

dict = {string_for_key: string_for_value: string_for_deeper_value}

我收到了这个错误:

TypeError: 'str' object does not support item assignment  

我应该给出更多背景信息。我是:

  1. 创建一个字典
  2. 创建它的副本(因为我需要在迭代时编辑字典)
  3. 在运行某些查询时迭代第一个字典
  4. 尝试将查询结果指定为字典中每个“key:value”的值。
  5. 这是一张显示我的意思的图片:

    key:value:query_as_new_value

    -----编辑-----

    对不起,我应该澄清一下:字典的名字实际上并不是'dict';我在我的问题中称它为“字典”,表明它是一本字典。

    - - - - - - - - 编辑

    我将发布我在脚本中编写的整个过程。在函数的最后一个命令期间发生错误。最底层的评论是我尝试过的其他一些事情。

    from collections import defaultdict
    
    global query_line, pericope_p, pericope_f, pericope_e, pericope_g
    
    
    def _pre_query(self, typ):
        with open(self) as f:
            i = 1
            for line in f:
                if i == query_line:
                    break
                i += 1
            target = repr(line.strip())
        ###skipping some code
        pericope_dict_post[self][typ] = line.strip()
        #^Outputs error TypeError: 'str' object does not support item assignment
        return
    
    
    pericope_dict_pre = {'pericope-p.txt': 'pericope_p',
                         'pericope-f.txt': 'pericope_f',
                         'pericope-e.txt': 'pericope_e',
                         'pericope-g.txt': 'pericope_g'}
    pericope_dict_post = defaultdict(dict)
    #pericope_dict_post = defaultdict(list)
    #pericope_dict_post = {}
    for key, value in pericope_dict_pre.items():
        pericope_dict_post[key] = value
            #^Works
        #pericope_dict_post.update({key: value})
            #^Also works
        #pericope_dict_post.append(key)
            #^AttributeError: 'dict' object has no attribute 'append'
        #pericope_dict_post[key].append(value)
            #^AttributeError: 'dict' object has no attribute 'append'
        _pre_query(key, value)
    

    -----最终编辑-----

    Matthias帮助我解决了问题,尽管acushner也有解决方案。我试图让字典深入三个“级别”,但Python字典无法以这种方式工作。相反,我需要创建一个嵌套字典。为了使用插图,当我需要{key: value: value}时,我尝试{key: {key: value}}

    要将此应用于我的代码,我需要一次创建包含所有三个字符串的[second]字典。所以不要这样:

    my_dict[key] = value1
    my_dict[key][value1] = value2
    

    我需要这样做:

    my_dict[key][value1] = value2
    

    非常感谢你们的帮助!

3 个答案:

答案 0 :(得分:4)

您可以创建一个单独扩展的字典(需要Python 3)。

class AutoTree(dict):
"""Dictionary with unlimited levels"""

     def __missing__(self, key):
        value = self[key] = type(self)()
        return value

像这样使用它。

data = AutoTree()
data['a']['b'] = 'foo'
print(data)

结果

{'a': {'b': 'foo'}}

现在,我将使用TypeError: 'str' object does not support item assignment消息解释您的问题。

此代码可以使用

from collections import defaultdict
data = defaultdict(dict)
data['a']['b'] = 'c'

data['a']不存在,因此使用默认值dict。现在data['a']dict,此词典会获得一个新值,其中包含键'b'和值'c'

此代码无法使用

from collections import defaultdict
data = defaultdict(dict)
data['a'] = 'c'
data['a']['b'] = 'c'

data['a']的值定义为字符串'c'。现在,您只能使用data['a']执行字符串操作。您现在无法将其用作字典,这就是data['a']['b'] = 'c'失败的原因。

答案 1 :(得分:1)

首先,不要使用dict作为变量名,因为它会影响同名内置。

第二,你想要的只是一个嵌套字典,不是吗?

from collections import defaultdict

d = defaultdict(dict)
d[string_for_key][string_for_value] = 'snth'
另一种方式,正如@Matthias所建议的那样,是创建一个无底字典:

dd = lambda: defaultdict(dd)
d = dd()
d[string_for_key][string_for_value] = 'snth'

答案 2 :(得分:0)

你可以这样做:

>>> my_dict = {}
>>> key = 'a'               # if key is not defined before it will raise NameError
>>> my_dict[key] = [1]
>>> my_dict[key].append(2)
>>> my_dict
{'a': [1, 2]}

注意:dict是内置的,不要将其用作变量名称