在参数列表中指定嵌套字典的键

3

我有一个函数,它遍历字典列表,并返回指定的键-值对到一个新的字典列表中:

data = [
    {'user': {'login': 'foo1', 'id': 'bar2'}, 'body': 'Im not sure', 'other_field': 'value'},
    {'user': {'login': 'foo2', 'id': 'bar3'}, 'body': 'Im still not sure', 'other_field': 'value'},
]

filtered_list = []
keys = ['user','body']

for i in data:
    filt_dict = dict((k, i[k]) for k in keys if k in i)
    filtered_list.append(filt_dict)
< p > user键包含一个名为login的子键; 如何将其添加到密钥参数列表而不是键user

样本输出:

filtered_list = [
    {'login': 'foo1', 'body': 'Im not sure'},
    {'login': 'foo2', 'body': 'Im still not sure'},
]

1
伪代码 keys 的输出应该长什么样子? - timgeb
1
请查看上述编辑。 - Laurie
我们能否将 keys 结构更改为元组列表?例如, [('user', 'login'), ('body',)] - PM 2Ring
可以,只需要针对登录字段进行操作,例如('login', 'body')。 - Laurie
1
顺便提一下,你应该修复字符串中的引号。 - PM 2Ring
显示剩余2条评论
2个回答

5
这样怎么样?假设您正在迭代的字典中实际存在您的键链。
设置
>>> from functools import reduce
>>> data = [{'user': {'login': 'foo1', 'id': 'bar2'}, 'body': 'Im not sure', 'other_field': 'value'},
...         {'user': {'login': 'foo2', 'id': 'bar3'}, 'body': 'Im still not sure', 'other_field': 'value'}]
>>> keys = [('user', 'login'), ('body',)]

解决方案

>>> [{ks[-1]: reduce(dict.get, ks, d) for ks in keys} for d in data]
[{'body': 'Im not sure', 'login': 'foo1'}, {'body': 'Im still not sure', 'login': 'foo2'}]

我将Ralf的答案标记为正确答案,因为它很简单,但是你的代码也有效,感谢你的努力。 - Laurie
3
我假设你希望这段代码适用于任何关键字列表。如果你可以硬编码关键字,那么我的答案就太复杂了。如果你不能硬编码关键字,那么另一个答案就不会让你有太大进展。;) - timgeb
1
@LaurieBamber 这段代码处理任意长度的keys列表和任意深度的嵌套字典。Ralph的答案很好,但它被锁定在问题中显示的特定结构中,因此如果您需要处理不同的键,则必须编辑代码。 - PM 2Ring
1
这是一个很棒的回应。 - vash_the_stampede

1
如果您确定列表中的所有元素(字典)都具有您指定的键,则快速解决方案可能是这样的:
filtered_list = [
    {
        'login': elem['user']['login'],
        'body': elem['body'],
    }
    for elem in data]

这段代码没有处理缺失键的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接