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
来完成。