我在Python中有一个函数,它由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‘\n nPins’: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发布于 2018-01-01 04:04:53
看起来,你似乎想要能够得到所有的可怜的wifi得分并行。每个人都是正确的,--使用全局字典是一个非常糟糕的主意,。有一种不那么冗长的方式来完成你想要的事情:
return (hotel_name, wifi_score)filter过滤掉您的NoneTypes:
hotels_with_low_wifi_quality = dict(filter(None, returned_list))在上面没有提供函数的情况下,筛选器根据python对该项的真实性的评估来计算列表中的每一项;只需记住一些内容。
发布于 2018-01-01 01:31:20
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
)https://stackoverflow.com/questions/48046624
复制相似问题