繁体   English   中英

将相同的键但不同的值(来自列表)添加到嵌套字典

[英]Add same key but different values (coming from list) to a nested dictionary

我设法抓取了一些内容并将其组织为这样的嵌套字典。

country_data = {
    "US": {
        "People": [
            {
                "Title": "Pres.",
                "Name": "Joe"
            },
            {
                "Title": "Vice",
                "Name": "Harris"
            }
        ]
    }
}

然后我有这个清单

tw_usernames = ['@user1', '@user2']

我想用它来将每个项目列表添加到 People 嵌套字典的每个条目中。 我已经对列表和字典理解做了一些研究,但我找不到使它起作用的东西,所以我尝试了这个基本代码,但它当然不是我想要的,因为它返回所有项目列表。

for firstdict in country_data.values():
    for dictpeople in firstdict.values():
        for name in dictpeople:
            name['Twitter'] = tw_usernames
            print(name)

那么你会怎么做才能得到这样的字典呢?

country_data = {
    "US": {
        "People": [
            {
                "Title": "Pres.",
                "Name": "Joe",
                "Twitter": "@user1"
            },
            {
                "Title": "Vice",
                "Name": "Harris",
                "Twitter": "@user2"
            }
        ]
    }
}

在此先感谢您提供任何可以教我的提示。

您可以 zip 使用用户名列表的子字典列表并迭代生成的对序列以将Twitter键添加到每个子字典:

for person, username in zip(country_data['US']['People'], tw_usernames):
    person['Twitter'] = username

使用您的示例输入, country_data将变为:

{'US': {'People': [{'Title': 'Pres.', 'Name': 'Joe', 'Twitter': '@user1'}, {'Title': 'Vice', 'Name': 'Harris', 'Twitter': '@user2'}]}}

源代码

def add_twitter_usernames_to_users(country_data: dict, tw_usernames: [str]):
    for tw_username in tw_usernames:
        country_data["US"]["People"][tw_usernames.index(tw_username)]["Twitter"] = tw_username

    return country_data

测试

def test_add_twitter_usernames_to_users():
    country_data = {
        "US": {
            "People": [
                {
                    "Title": "Pres.",
                    "Name": "Joe"
                },
                {
                    "Title": "Vice",
                    "Name": "Harris"
                }
            ]
        }
    }

    tw_usernames = ['@user1', '@user2']

    updated_country_data: dict = so.add_twitter_usernames_to_users(country_data, tw_usernames)

    assert updated_country_data["US"]["People"][0]["Twitter"] == "@user1"
    assert updated_country_data["US"]["People"][1]["Twitter"] == "@user2"

尝试这个。 我刚刚在您的逻辑中添加了索引。 它将根据索引选择用户名

idx = 0
tw_usernames = ['@user1', '@user2']
for firstdict in country_data.values():
    for dictpeople in firstdict.values():
        for name in dictpeople:
            name['Twitter'] = tw_usernames[idx]
            idx+=1

print(country_data)

output

{
   "US":{
      "People":[
         {
            "Title":"Pres.",
            "Name":"Joe",
            "Twitter":"@user1"
         },
         {
            "Title":"Vice",
            "Name":"Harris",
            "Twitter":"@user2"
         }
      ]
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM