【问题标题】:some basic looping through the list of dictionaries and adding the chosen key values to the new dictionary一些基本的遍历字典列表并将所选键值添加到新字典
【发布时间】:2022-01-01 09:40:47
【问题描述】:

在遍历字典列表时遇到了一些基本问题。我想遍历名为 jslist 的列表并获得底部显示的输出。基本上我想从列表中提取选择的键:值对(我在下面粘贴的示例 - site_id、sitekey、昵称)并将它们存储在另一个字典列表中。

jslist = [
    {'site_id': '1111111', 'hostname': 'abc.com', 'nickname': 'abc.com', 'sitekey': '29346385345', 'sitekey_admin': '293857349857934857345', 'timezone': '1', 'visitors_online': '1', 'visitors_today': '34'}, 
    {'site_id': '100992048', 'hostname': 'gcd.com', 'nickname': 'gcd.com', 'sitekey': '938573945739453', 'sitekey_admin': '20395734985793', 'timezone': '1', 'visitors_online': '0', 'visitors_today': '2'}]

dict_1 = {}

for k in jslist:
    dict_1['site_id'] = k['site_id']
    dict_1['sitekey'] = k['sitekey']
    dict_1['nickname'] = k['nickname']


print(list(dict_1))

当前输出:

{'site_id': '100992048', 'sitekey': '938573945739453', 'nickname': 'gcd.com'}

预期输出

[{'site_id': '100992048', 'sitekey': '938573945739453', 'nickname': 'gcd.com'},{'site_id': '1111111', 'sitekey': '29346385345', 'nickname': 'abc.com'}]

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案1】:

    您为每个使用一个字典,因此您不断附加相同的实例,字典创建应该在循环内。您还可以将所需的键存储在列表中,以使代码更容易更新和正确

    结合列表推导

    keep = {'site_id', 'sitekey', 'nickname'}
    jslist_new = [{k: item[k] for k in keep} for item in jslist]
    

    【讨论】:

    • 列表理解是我认为在这里最有用且最易于管理的内容。谢谢
    • azro - 如果您可以在这里稍微解释一下或通过一些外部资源来了解我不知道该怎么称呼它 - “嵌套?”列表理解中的字典理解?
    • 请注意,keep 不需要是 set,因为您是 循环 遍历它,而不是测试成员资格,它与 tuple 一样快.
    • @MichalK 和一级差不多,可以看stackoverflow.com/questions/18072759/…
    【解决方案2】:

    您只是在更新同一个字典,而不是将字典推送到新列表。方法如下:

    jslist = [
        {'site_id': '1111111', 'hostname': 'abc.com', 'nickname': 'abc.com', 'sitekey': '29346385345', 'sitekey_admin': '293857349857934857345', 'timezone': '1', 'visitors_online': '1', 'visitors_today': '34'}, 
        {'site_id': '100992048', 'hostname': 'gcd.com', 'nickname': 'gcd.com', 'sitekey': '938573945739453', 'sitekey_admin': '20395734985793', 'timezone': '1', 'visitors_online': '0', 'visitors_today': '2'}]
    
    jslist_new = []
    
    for k in jslist:
        dict_1 = {}
        dict_1['site_id'] = k['site_id']
        dict_1['sitekey'] = k['sitekey']
        dict_1['nickname'] = k['nickname']
        jslist_new.append(dict_1)
    
    print(jslist_new)
    

    【讨论】:

    • 只是 jslist_new.append(dict1) 中的拼写错误,而不是 jslist_new.append(dict_1)。有用。谢谢
    • 已更新。谢谢你。
    【解决方案3】:

    您可以将所需的值存储在临时字典中并将其附加到列表中......就像这样

    jslist = [
        {'site_id': '1111111', 'hostname': 'abc.com', 'nickname': 'abc.com', 'sitekey': '29346385345', 'sitekey_admin': '293857349857934857345', 'timezone': '1', 'visitors_online': '1', 'visitors_today': '34'}, 
        {'site_id': '100992048', 'hostname': 'gcd.com', 'nickname': 'gcd.com', 'sitekey': '938573945739453', 'sitekey_admin': '20395734985793', 'timezone': '1', 'visitors_online': '0', 'visitors_today': '2'}]
    
    res = []
    
    for dct in jslist:
        temp = dict()
    
        for key, val in dct.items():
            if key in ("site_id", "sitekey", "nickname"):
                temp[key] = val
    
        res.append(temp)
    
    print(res)
    

    你可以把它压缩成这样的列表理解...

    jslist = [
        {'site_id': '1111111', 'hostname': 'abc.com', 'nickname': 'abc.com', 'sitekey': '29346385345', 'sitekey_admin': '293857349857934857345', 'timezone': '1', 'visitors_online': '1', 'visitors_today': '34'}, 
        {'site_id': '100992048', 'hostname': 'gcd.com', 'nickname': 'gcd.com', 'sitekey': '938573945739453', 'sitekey_admin': '20395734985793', 'timezone': '1', 'visitors_online': '0', 'visitors_today': '2'}]
    
    res = [{key:val for key, val in dct.items() if key in ("site_id", "sitekey", "nickname")} for dct in jslist]
    
    print(res)
    

    【讨论】:

    • 代码改进注意事项:不要遍历dct,然后过滤它们是否在您的列表中:直接在您的列表上进行迭代
    • 罗杰,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多