【问题标题】:Return multiple dictionaries from the function in Python从 Python 中的函数返回多个字典
【发布时间】:2020-04-19 14:53:09
【问题描述】:

我试图了解如何从一个函数返回多个字典。如果我在函数本身中打印出 data_dict,我会得到五个字典。如果 data_dict 将从函数返回,存储在变量中然后打印出来,则只会显示最后一个字典。五本词典如何全部归还?

import requests
from bs4 import BeautifulSoup
import re
import json

source = requests.get('https://www.tripadvisor.ch/Hotel_Review-g188113-d228146-Reviews-Coronado_Hotel-Zurich.html#REVIEWS').text

soup = BeautifulSoup(source, 'lxml')

pattern = re.compile(r'window.__WEB_CONTEXT__={pageManifest:(\{.*\})};')
script = soup.find("script", text=pattern)
dictData = pattern.search(script.text).group(1)
jsonData = json.loads(dictData)


def get_reviews():

    data_dict = {}
    for locations in jsonData['urqlCache']['669061039']['data']['locations']:
        for data in locations['reviewListPage']['reviews']:
            data_dict['reviewid'] = data['id']
            data_dict['authoridtripadvisor'] = data['userId']
            userProfile = data['userProfile']
            data_dict['author'] = userProfile['displayName']    
            print(data_dict)
    #return data_dict

reviews = get_reviews()
print(reviews)

感谢您的所有建议!

【问题讨论】:

  • return dict1, dict2, dict3
  • 您的问题是在data_dict 中您只能保留一本字典。您必须为所有字典和 append() 每个字典创建列表到此列表,并返回此字典列表。

标签: python json dictionary return


【解决方案1】:

您的问题是在data_dict 中您只能保留一本字典。

您必须为所有词典创建列表

all_dictionaries = []

append()此列表中的每个字典

all_dictionaries.append(data_dict)

return这个列表

return all_dictionaries

for-loop 中,您必须为新数据创建新字典。您不能使用一个data_dict 来替换此字典中的元素。


def get_reviews():

    all_dictionaries = []

    for locations in jsonData['urqlCache']['669061039']['data']['locations']:
        for data in locations['reviewListPage']['reviews']:

            data_dict = {}

            data_dict['reviewid'] = data['id']
            data_dict['authoridtripadvisor'] = data['userId']
            userProfile = data['userProfile']
            data_dict['author'] = userProfile['displayName']    
            print(data_dict)

            all_dictionaries.append(data_dict)

    return all_dictionaries

【讨论】:

    【解决方案2】:

    编辑:查看@Furas 的答案,但几乎相同(在点击提交之前没有看到其他答案)

    如果您提前知道要返回的字典数量,可以这样返回:

    def get_reviews():
        # ...
        return dict1, dict2, dict3
    

    然后使用这样的结果:

    d1, d2, d3 = get_reviews()
    

    但如果你想返回任意数量的结果,你应该返回一个包含所有字典的列表:

    import requests
    from bs4 import BeautifulSoup
    import re
    import json
    
    source = requests.get('https://www.tripadvisor.ch/Hotel_Review-g188113-d228146-Reviews-Coronado_Hotel-Zurich.html#REVIEWS').text
    
    soup = BeautifulSoup(source, 'lxml')
    
    pattern = re.compile(r'window.__WEB_CONTEXT__={pageManifest:(\{.*\})};')
    script = soup.find("script", text=pattern)
    dictData = pattern.search(script.text).group(1)
    jsonData = json.loads(dictData)
    
    
    def get_reviews():
        data = []
        for locations in jsonData['urqlCache']['669061039']['data']['locations']:
            for data in locations['reviewListPage']['reviews']:
                data.append({
                    'reviewid': data['id'],
                    'authoridtripadvisor': data['userId'],
                    'author': data['userProfile']['displayName'] 
                })
    
        return data
    
    reviews = get_reviews()
    print(reviews)
    

    【讨论】:

    • 有时我也会遇到这种情况 - 我按 submit 然后我看到其他答案或 cmets :) 我们几乎没有不同的代码,它可能很有用。
    猜你喜欢
    • 2017-11-23
    • 2018-05-15
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    相关资源
    最近更新 更多