【问题标题】:How to extract data from a list of dictionaries from a filter如何从过滤器的字典列表中提取数据
【发布时间】:2020-07-08 08:02:59
【问题描述】:

我有一个字典列表,它是从论坛中抓取的 HTML 元素:

[{'title': 'aaa', 'responses': '1 response', 'url': 'https://www.example.com/aaa'}, {'title': 'bbb', 'responses': '4 responses', 'url': 'https://www.example.com/bbb'}, {'title': 'ccc', 'responses': '2 responses', 'url': 'https://www.example.com/ccc'}, {'title': 'ddd', 'responses': '8 responses', 'url': 'https://www.example.com/ccc'}, {'title': 'eee', 'responses': '2 responses', 'url': 'https://www.example.com/eee'}]

如果 'reponses' 项小于 2 个响应,我想从字典中提取 'url' 项。 我尝试了这段代码,它运行良好,但仅适用于第一项:

dict = {'url1': ''}
item1 = "1 response"
item2 = "2 responses"
if item1 in scrape[0]['responses'] or item2 in scrape[0]['responses']:
    dict['url1'] = scrape[0]['url']
    print(dict)

{'url1': 'https://www.example.com/aaa'}

如果我删除 [0] 元素,我会得到:TypeError: list indices must be integers or slices, not str

我想要这个结果:

{'url1': 'https://www.example.com/aaa', 'url2': 'https://www.example.com/eee'}

如何做到这一点?

【问题讨论】:

  • 您要包含 2 个回复吗?如果是这样,为什么预期结果没有https://www.example.com/eee?另外,你要枚举你的结果dict的key吗?
  • 只是澄清一下:您的问题是如何为 the_scrap 中的 each_entry 执行此操作,对吗?
  • 对不起,你是对的。我在参加的结果中犯了一个错误。我编辑我的帖子。是的,我想测试废料中的每个条目以搜索“响应”元素并根据数字提取数据:如果它是
  • 你知道for循环是什么吗?
  • 是的,但是由于我是 Python 的初学者,这种操作对于我的技能水平来说有点太高级了。无论如何,这是一个开始学习的好练习。感谢在这里发布的其他成员,我的升级速度非常快;)

标签: python list dictionary


【解决方案1】:

你可以写一个函数,用filter(...)就行了:

lst = [{'title': 'aaa', 'responses': '1 response', 'url': 'https://www.example.com/aaa'}, {'title': 'bbb', 'responses': '4 responses', 'url': 'https://www.example.com/bbb'}, {'title': 'ccc', 'responses': '2 responses', 'url': 'https://www.example.com/ccc'}, {'title': 'ddd', 'responses': '8 responses', 'url': 'https://www.example.com/ccc'}, {'title': 'eee', 'responses': '2 responses', 'url': 'https://www.example.com/eee'}]

def few_responses(item):
    number, _ = item['responses'].split()
    if (int(number) < 2):
        return True
    else:
        return False


for item in filter(few_responses, lst):
    print(item["url"])

或者,您可以使用执行相同操作的列表推导:

urls = [item["url"]
        for item in lst
        for number, _ in [item["responses"].split()]
        if (int(number) < 2)]
print(urls)

【讨论】:

  • 非常感谢。我更新了你的代码来改变这个:if (int(number) &lt;= 2)] 我得到了我想要的
  • 我已经投了赞成票并接受了它。你不会看到赞成票,因为我目前没有足够的声誉,但它已经很好地注册了。再次感谢。
【解决方案2】:

这是一种使用简单迭代的方法,str.split

例如:

data = [{'title': 'aaa', 'responses': '1 response', 'url': 'https://www.example.com/aaa'}, {'title': 'bbb', 'responses': '4 responses', 'url': 'https://www.example.com/bbb'}, {'title': 'ccc', 'responses': '2 responses', 'url': 'https://www.example.com/ccc'}, {'title': 'ddd', 'responses': '8 responses', 'url': 'https://www.example.com/ccc'}, {'title': 'eee', 'responses': '2 responses', 'url': 'https://www.example.com/eee'}]
res = [item['url'] for item in data if int(item['responses'].split()[0]) < 2]
print(res)  # --> ['https://www.example.com/aaa']

【讨论】:

    【解决方案3】:

    循环遍历列表,并将“responses”键的每个值转换为一个int,然后检查它是否小于2,如果是,则打印URL(插入一个额外的项目,fffin l为清楚起见):

    l = [{'title': 'aaa',
          'responses': '1 response',
          'url': 'https://www.example.com/aaa'
          },
         {'title': 'bbb', 'responses': '4 responses', 'url': 'https://www.example.com/bbb'},
         {'title': 'ccc', 'responses': '2 responses', 'url': 'https://www.example.com/ccc'},
         {'title': 'ddd', 'responses': '8 responses', 'url': 'https://www.example.com/ccc'},
         {'title': 'eee', 'responses': '2 responses', 'url': 'https://www.example.com/eee'},
         {'title': 'fff', 'responses': '1 responses', 'url': 'https://www.example.com/fff'}
     ]
    
    
    def less_responses_than_n(r, n=2, count=0):
        for d in l:
            if int(d["responses"].split()[0]) < n:
                count += 1
                r[f'url_{count}'] = d["url"]
        return r
    
    
    r = dict()
    print(less_responses_than_n(r))
    print(less_responses_than_n(r, n=3))
    

    返回:

    {'url_1': 'https://www.example.com/aaa', 'url_2': 'https://www.example.com/fff'}
    {'url_1': 'https://www.example.com/aaa', 'url_2': 'https://www.example.com/ccc', 'url_3': 'https://www.example.com/eee', 'url_4': 'https://www.example.com/fff'}
    
    

    【讨论】:

    • 谢谢。这是我要搜索的结果类型。
    • 我很高兴听到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多