我在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
答案 0 :(得分:2)
看起来你希望能够并行获得所有可怜的wifi分数 。每个人都认为使用全球词典这是一个非常糟糕的主意。有一种不那么冗长的方式来实现你想要的东西:
返回由(酒店名称,分数)组成的(元组) get_accomodation_wifi_rating函数:
return (hotel_name, wifi_score)
使用python的内置filter
过滤掉你的NoneTypes:
hotels_with_low_wifi_quality = dict(filter(None, returned_list))
上面没有提供函数的过滤器根据 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
)