【问题标题】:How to create sub-dictionaries without overwriting each entry?如何在不覆盖每个条目的情况下创建子词典?
【发布时间】:2019-11-14 08:44:45
【问题描述】:
east = {"George Street": "52.1382238, -0.4496112", 
        "Barnstable Road": "52.143864, -0.4474769", 
        "Newnham Avenue": "52.1367876, -0.4448371"}
mainzone = {"Anglia Cars": "52.138622, -0.466633",
            "Bedford train station": "52.135694, -0.478704", 
            "Swan hotel": "52.134863, -0.465163"}

MainToEast = {}
for key in dict.items(mainzone):
    for i in dict.items(east):
        varFrom = key[1]
        varTo = i[1]
        MainToEast.update({key[0]: {i[0]: '£4.00'}})

每次运行此循环时,它都会“更新”字典集,而不是添加新值(即字典)。

我已经尝试.setdefault 作为第一个键,但它做同样的事情。我确定这是循环的问题,但无法解决。

预期结果:

{'Anglia Cars': {'George Street': '£4.00'}, 
                {'Barnstable Road': '£4.00'}, 
                {'Newnham Avenue': '£4.00'}}....
{'Bedford train station': {'George Street': '£4.00'}, 
                          {'Barnstable Road': '£4.00'}, 
                          {'Newnham Avenue': '£4.00'}}....

输出必须采用这种格式。不是字典中的列表。我在不接受后一个数据集的数据框中使用数据集。

【问题讨论】:

    标签: python-3.x dictionary for-loop


    【解决方案1】:

    预期的输出数据结构无效。你可能需要一个列表的字典。

    例如:(使用dict.setdefault

    east = {"George Street": "52.1382238, -0.4496112", 
    "Barnstable Road": "52.143864, -0.4474769", "Newnham Avenue": "52.1367876, -0.4448371"}
    mainzone = {"Anglia Cars": "52.138622, -0.466633",
     "Bedford train station": "52.135694, -0.478704", "Swan hotel": "52.134863, -0.465163"}
    
    MainToEast = {}
    
    for key in mainzone:
        for sub_key in east:
            MainToEast.setdefault(key, []).append({sub_key: '£4.00'})
    
    print(MainToEast)
    

    输出:

    {'Anglia Cars': [{'George Street': '£4.00'},
                     {'Barnstable Road': '£4.00'},
                     {'Newnham Avenue': '£4.00'}],
     'Bedford train station': [{'George Street': '£4.00'},
                               {'Barnstable Road': '£4.00'},
                               {'Newnham Avenue': '£4.00'}],
     'Swan hotel': [{'George Street': '£4.00'},
                    {'Barnstable Road': '£4.00'},
                    {'Newnham Avenue': '£4.00'}]}
    

    【讨论】:

    • 感谢您的回复;我遇到的问题是我不能将第二个字典作为列表,因为我正在使用熊猫。 {'Anglia Cars': {'George Street': '£4.00'} 格式是必须的,否则我会得到 ValueError: arrays must be all be the same length when I run a dataframe with that dataset
    【解决方案2】:

    问题的关键在于您正在使用update 方法,您实际上希望在其中向字典添加新键。 dict.update() 更新给定键的值,如果它已经存在于字典中。如果密钥不存在 dict.update() 则添加它。在以下示例中,创建了一个 dict,其中包含一个名为“x”的键及其对应的值 1234。对 abc.update 的调用 更新x 的值,因为'x' 已经是abc 的现有键。它还将新密钥“y”添加到abc,因为它还不是abc 的一部分。

    abc = {'x': 1234}
    abc.update({'x': 999, 'y': 222})
    # result: {'x': 999, 'y': 222}
    

    要向字典添加新键和对应值,您可以使用模式dict_name[key] = value。要将新的键/值对 ('z', 17) 添加到上述字典 abc,您可以编写:

    abc['z'] = 17
    

    为了对项目进行迭代,没有必要从字典的项目中创建一个字典项目对象,因为它们已经是字典项目。因此,您宁愿在循环中执行以下操作:

    for key in mainzone.items():
        ...
    

    但是,使用.items() 方法进行迭代会产生一个元组(key, value)。这就是为什么必须写key[0] 来获得所需的密钥。但是您只需要键而不是值,因此最好简单地遍历字典键:

    for val in mainzone.keys():
        ...
    

    在 Python 中,您不想将“CamelCase”用于变量名,因为它是为类保留的。有关这方面的更多信息,请参阅PEP8。而是使用带有下划线的所有小写字母作为分隔符。

    此外,将坐标存储为浮点元组而不是字符串是合适的,因为它们就是:一对数字。你会选择一个元组而不是一个列表,因为元组是不可变的对象,你不希望你的坐标被改变。 因此,这是一个解决您的问题的工作示例:

    east = {
        "George Street": (52.1382238, -0.4496112), 
        "Barnstable Road": (52.143864, -0.4474769), 
        "Newnham Avenue": (52.1367876, -0.4448371)}
    
    mainzone = {
        "Anglia Cars": (52.138622, -0.466633),
        "Bedford train station": (52.135694, -0.478704),
        "Swan hotel": (52.134863, -0.465163)}
    
    
    main_to_east = {}
    for main_station in mainzone.keys():
        main_to_east[main_station] = {east_station: '£4.00' for east_station in east.keys()}
    

    【讨论】:

    • 非常感谢...我知道这就是.update 不起作用的原因,我只是想不出添加值的方法。 .items.keys 也是黄金。数字是字符串格式的原因是因为它们必须通过API调用传递,该API调用只能将字符串值作为参数。
    【解决方案3】:

    这是另一种使用list / dict理解的方法。不确定此逻辑是否满足您的要求,但可能对查看此帖子的其他人有所帮助。

    east = {"George Street": "52.1382238, -0.4496112", 
            "Barnstable Road": "52.143864, -0.4474769", 
            "Newnham Avenue": "52.1367876, -0.4448371"}
    mainzone = {"Anglia Cars": "52.138622, -0.466633",
                "Bedford train station": "52.135694, -0.478704", 
                "Swan hotel": "52.134863, -0.465163"}
    
    # Create a list of dicts for your sub-keys.
    subs = [{i: '£4.00'} for i in east]
    # Add the sub-key to each main key.
    MainToEast = {i: sub for i in mainzone}
    

    输出:

    {'Anglia Cars': [{'George Street': '£4.00'},
                     {'Newnham Avenue': '£4.00'},
                     {'Barnstable Road': '£4.00'}],
     'Bedford train station': [{'George Street': '£4.00'},
                               {'Newnham Avenue': '£4.00'},
                               {'Barnstable Road': '£4.00'}],
     'Swan hotel': [{'George Street': '£4.00'},
                    {'Newnham Avenue': '£4.00'},
                    {'Barnstable Road': '£4.00'}]}
    

    【讨论】:

    • 它会产生一个结果,但不会产生预期或要求 nks 回复的结果;我遇到的问题是我不能将第二本字典作为列表,因为我正在使用熊猫。 {'Anglia Cars': {'George Street': '£4.00'} 格式是必须的,否则我会得到 ValueError: arrays must be all be the same length when I run a dataframe with that dataset
    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2018-08-30
    • 2014-10-14
    • 2019-12-14
    相关资源
    最近更新 更多