首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将map()函数返回的列表(从Pool类)转换为Python字典

将map()函数返回的列表(从Pool类)转换为Python字典
EN

Stack Overflow用户
提问于 2018-01-01 01:19:44
回答 2查看 984关注 0票数 1

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

代码语言:javascript
复制
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‘\n nPins’:u'4,3'},无,无

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

下面是get_accomodation_wifi_rating

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-01 04:04:53

看起来,你似乎想要能够得到所有的可怜的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))

在上面没有提供函数的情况下,筛选器根据python对该项的真实性的评估来计算列表中的每一项;只需记住一些内容。

票数 3
EN

Stack Overflow用户

发布于 2018-01-01 01:31:20

Python有更好的语法,称为列表理解,用于映射和筛选。你可以实现你想要的样子

代码语言:javascript
复制
# 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元组就可以执行以下操作。

代码语言:javascript
复制
hotels_with_low_wifi_quality = dict(
    x
    for x in [get_accomodation_wifi_rating(name) for name in pool]
    if x is not None
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48046624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档