将map()函数(从Pool类)返回的列表转换为Python中的Dictionary

时间:2018-01-01 01:19:45

标签: python list dictionary data-structures

我在Python中有一个函数,它由map()函数调用,迭代列表中作为参数发送的所有元素。此函数返回一个字典,并将map函数分配给字典,但Python解释器将其转换为列表。

hotels_with_low_wifi_quality = pool.map(get_accomodation_wifi_rating, hotels_url_list)

所以在上面的句子中,hotels_with_low_wifi_quality是一个字典,get_accomodation_wifi_rating是一个返回字典的函数。

但如果我打印hotels_with_low_wifi_quality,它会输出以下内容:

[无,无,无,无,无,无,无,无,无,{u' \ nPins Platja \ n':u' 4,3'},无,无,无,无,无] 无

这显然是一个清单。如何将其转换为字典,其中忽略None值,唯一的元素是[" Pins Platja"] = 4.3

以下是get_accomodation_wifi_rating

def get_accomodation_wifi_rating(hotel):
page = requests.get(hotel)
soup = BeautifulSoup(page.text, 'lxml')
hotel_name = soup.find(id = "hp_hotel_name").text
reviews = soup.find(class_="review_list_score_breakdown_right")
if reviews is not None:
    wifi_tag = reviews.find(attrs={"data-question" : "hotel_wifi"})
    if wifi_tag is not None:
        wifi_rating = wifi_tag.find(class_="review_score_value")
        wifi_score = wifi_rating.text
        wifi_score_num = wifi_score.replace(",", ".")
        if float(wifi_score_num) < 7:
            hotels_with_low_wifi_quality[hotel_name] = wifi_score
            return hotels_with_low_wifi_quality

2 个答案:

答案 0 :(得分:2)

看起来你希望能够并行获得所有可怜的wifi分数 。每个人都认为使用全球词典这是一个非常糟糕的主意。有一种不那么冗长的方式来实现你想要的东西:

  1. 返回由(酒店名称,分数)组成的(元组) get_accomodation_wifi_rating函数:

    return (hotel_name, wifi_score)

  2. 使用python的内置filter过滤掉你的NoneTypes:

    hotels_with_low_wifi_quality = dict(filter(None, returned_list))

  3. 上面没有提供函数的过滤器根据 python的评估该项目的真实性来评估列表中的每个项目;只是要记住一些事情。

答案 1 :(得分:0)

Python具有更好的语法,称为列表理解,用于映射和过滤。你可以实现你想要的东西

# We first map to get ratings
ratings = [get_accomodation_wifi_rating(name) for name in pool]

# We then filter the None out
ratings = [x for x in ratings if x is not None]

# We now have a list of `dict` which we want to merge
hotels_with_low_wifi_quality = {
    name: rating
        for d in ratings
        for name, rating in d.items()
}

虽然,我想指出你的函数get_accomodation_wifi_rating的返回类型对于你想做的事情来说是一种尴尬。

首先,它似乎填充了全局dict并返回它,这是一个really bad idea

其次,为了您正在使用它,我只需返回name, rating元组就可以执行以下操作。

hotels_with_low_wifi_quality = dict(
    x
    for x in [get_accomodation_wifi_rating(name) for name in pool]
    if x is not None
)