Python过滤字典列表

时间:2020-02-25 13:36:06

标签: python python-3.x

新手,请保持温柔。

我有一个生成har文件的硒脚本,代码如下:

proxy.har  # returns a HAR
for ent in proxy.har['log']['entries']:
    _url = ent['request']['headers']
    _response = ent['response']
    #print(ent)
    for item in ent['request']['headers']:
        print(item)

以下是输出:

{'value': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5 (KHTML, like Gecko) Chrome/ Safari/', 'name': 'User-Agent'}
{'value': 'application/json', 'name': 'content-type'}
{'value': '8d14747f41e552da0076374b6646b1d309763357195e2ec5b6be6da1d12dcf6801113', 'name': 'a-security-token'}
{'value': '8e9720fcead251fafd2c215443e3c6e7555667990f00bcfad70127e340048eb901113', 'name': 'ccu'}
{'value': 'isAjax:true', 'name': 'ADRUM'}
{'value': '*/*', 'name': 'Accept'}

我想过滤掉a-security令牌值和ccu值。我已经尝试过使用lambda,但是它什么都不打印,这是我的lambda代码:

filtered_item = filter(lambda d: 'ccu' in d , item)
for d in filtered_item:
   print(d)

O

3 个答案:

答案 0 :(得分:1)

首先,我认为标头具有字典列表的格式是非常差的,在进一步操作之前,我将其转换为适当的python字典。 例如:

headers = {e['name']: e['value'] for e in ent['request']['headers']}

给出:

{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5 (KHTML, like Gecko) Chrome/ Safari/', 'content-type': 'application/json', 'a-security-token': '8d14747f41e552da0076374b6646b1d309763357195e2ec5b6be6da1d12dcf6801113', 'ccu': '8e9720fcead251fafd2c215443e3c6e7555667990f00bcfad70127e340048eb901113', 'ADRUM': 'isAjax:true', 'Accept': '*/*'}

然后很容易从此列表中获取任何标题:

>>> headers['ccu']
'8e9720fcead251fafd2c215443e3c6e7555667990f00bcfad70127e340048eb901113'
>>> headers['a-security-token']
'8d14747f41e552da0076374b6646b1d309763357195e2ec5b6be6da1d12dcf6801113'

易于阅读和操作。

答案 1 :(得分:0)

以下列表理解应为您提供符合条件的所有values的列表:

filtered_items = [d['value'] for d in har_list if d['name'] in ['a-security-token', 'ccu']]

但是,如果这些项目仅在列表中每个出现一次,并且您想单独获得它们,则可以使用next方法,该方法还可以确保在数据出现时代码不会中断找不到:

a_sec_token = next((d['value'] for d in har_list if d['name'] == 'a-security-token'), None)
ccu = next((d['value'] for d in har_list if d['name'] == 'ccu'), None)

答案 2 :(得分:0)

# function that filters rows given string
def get_item(row):
    string_to_compare='ccu'
    if(row['name'] == string_to_compare):
        return True
    else:
        return False

filtered_item = filter(get_item, item)

print('The filtered items are:')
for filt_item in filtered_item:
    print(filt_item)