Python 如何筛选列表中嵌套DICT中的值?

Python 如何筛选列表中嵌套DICT中的值?,python,list,dictionary,nested-loops,Python,List,Dictionary,Nested Loops,我有这样的内容结构: content = [ {'@type': 'ListItem', 'position': 1, 'item': {'@type': 'Product', 'url': 'TestSample', 'sku': 'HO6096863EAD7E0PH', 'mpn': 'HO6096863EAD7E0PH', '@id': 'HO6096863EAD7E0PH'}}, {'@type': 'ListItem', 'position': 2, 'it

我有这样的内容结构:

content = [
{'@type': 'ListItem', 'position': 1, 
   'item': 
    {'@type': 'Product', 'url': 'TestSample', 'sku': 'HO6096863EAD7E0PH', 'mpn': 'HO6096863EAD7E0PH', '@id': 'HO6096863EAD7E0PH'}},
 {'@type': 'ListItem', 'position': 2, 
   'item': 
    {'@type': 'Product', 'url': 'TestSample', 'sku': 'HO5FFFA64882401PH', 'mpn': 'HO5FFFA64882401PH', '@id': 'HO5FFFA64882401PH'}}
]
我需要使用键“url”获取所有值。我使用了这样的循环,它可以工作,但如何使它更容易?我读过函数“filter”,但不确定它是否适合我的情况

for r in content:
    k = r.get('item', {}).get('url')
    print(k)

输出应该是这样的:TestSample,TestSample

过滤器用于从iterable中筛选元素,您可以获得具有匹配条件的元素

但是如果你想从元素中得到子元素,你可以使用map函数

检查以下示例,此处lambda函数将从每个项目获取url,map将在列表中的每个dict上应用此lambda函数:

l = list(map(lambda x:x['item']['url'],content))
print(l)
输出为:

['TestSample', 'TestSample']

你的意思是
map
,而不是
filter

items = map(lambda x: x.get('item', {}).get('url'), content)
for item in items:
    print(item)
filtered = filter(lambda x: 'item' in x and 'url' in x['item'], content)
items = map(lambda x: x['item']['url'], filtered)
for item in items:
    print(item)
上面的代码将打印:

TestSample
TestSample
如果您想要一个带有
过滤器的示例

items = map(lambda x: x.get('item', {}).get('url'), content)
for item in items:
    print(item)
filtered = filter(lambda x: 'item' in x and 'url' in x['item'], content)
items = map(lambda x: x['item']['url'], filtered)
for item in items:
    print(item)

过滤器所做的是检查“item”和“url”是否在该字典值中,如果是,则将其添加到结果中,如果不是,则不会添加。通过这种方式,您可以确保
过滤后的
始终同时包含
url

为什么您对当前代码不满意?您的方法有什么问题?您可以使用理解来简化它:
k=[r.get('item',{}).get('url')用于内容中的r]
@Sandertjuhh非常感谢
filter
可以帮助您避免跳过没有其中一个键的字典,但是您也可以通过循环中的一个简单的
if
来完成。