Фильтрация словаря с вложенными вложенными списками - PullRequest
0 голосов
/ 16 марта 2020

Я хочу отфильтровать следующее по значению «abv» (используя только нижний предел диапазона. Например, если «ABV: 4,5-5,5%», я буду использовать 4,5 для значения ABV) и 'кухня'. Вот мой код:

import requests
from bs4 import BeautifulSoup 
import pandas as pd
import csv
from html.parser import HTMLParser


r = requests.get("https://www.webstaurantstore.com/article/27/different-types-of- 
beers.html")
soup = BeautifulSoup(r.text, "html.parser")
beer_titles = soup.find_all('h3')[3:-1]
beer_titles_list = []
for b in beer_titles:
    result = b.text.strip()
    beer_titles_list.append(result)

helpme = soup.find_all('p')
def __init__(self):
    helpme().__init__()
    helpme.reset()
    helpme.fed = []
helpme_clean = []
for d in helpme:
    result = d.text.strip()
    helpme_clean.append(result)
attributes = helpme_clean[36:-20]


helpme_clean = []
for d in helpme:
    result = d.text.strip()
    helpme_clean.append(result)
attributes = helpme_clean[36:-20]
attributes
attributes = attributes[:252]
del attributes[231]
del attributes[205]
del attributes[204]
del attributes[203]
del attributes[200]
del attributes[191]
del attributes[170]
del attributes[169]
del attributes[168]
del attributes[144]
del attributes[126]
del attributes[125]
del attributes[124]
del attributes[118]
del attributes[107]
del attributes[81]
del attributes[80]
del attributes[79]
del attributes[68]
del attributes[67]
del attributes[66]
del attributes[45]
del attributes[44]
del attributes[43]
del attributes[22]
del attributes[21]
del attributes[20]

n = 5
main_list = [attributes[i:i+n] for i in range(0, len(attributes), n)]
main_dict = dict(zip(beer_titles_list, main_list))
main_dict

Цель состоит в том, чтобы взять пользовательский ввод (предпочтение ABV% и кухню в паре) и найти рекомендации по стилю пива на выбор. Я пытаюсь настроить систему фильтров, чтобы можно было возвращать только пиво, которое соответствует как предпочтениям ABV%, так и сочетанию кухни. Любые советы будут с благодарностью.

Спасибо всем большое заранее!

1 Ответ

1 голос
/ 16 марта 2020

Самая прямая идея для сопоставления '4.5' из 'ABV: 4.5-5.5%' состоит в использовании регулярного выражения . Вот код:

import re
string='ABV: 4.5-5.5%'
output=re.search(r'([\d\.]+)\-[\d\.]+',string)[1]

Что касается удаления кратных значений в списке, использование простого понимания списка - это простой метод:

new_list=[old_list[i] for i in range(len(old_list)) if not i in indices]

Например:

import numpy as np 
old_list=np.random.random(10)
indices=np.random.choice(np.arange(0,10),5)
new_list=[old_list[i] for i in range(len(old_list)) if not i in indices]

print('The original list is:',list(old_list))
print('The indices to be removed are:',list(indices))
print('The new list is:',list(new_list))

Выход:

Оригинальный список: [+0,9233779986812494, +0,47976112127600334, +0,2669764806705126, +0,8598525413490794, +0,03257522197544993, +0,472960144751734, 0,07720026239677213, +0,22969097769323488, +0,3039956214047107, +0,5079366193702746]

1020 * Удаляемые индексы: [2, 0, 1, 7, 3]

Новый список: [0.03257522197544993, 0.472960144751734, 0.07720026239677213, 0.3039956214047107, 0.5079366193702746]

1024
...