在 Python 中定义依赖字典
Define Dependent Dictionaries in Python
我正在做一个 NLP 项目,分析 The Office 中角色所说的话。该项目的一部分涉及制作网络图,其中角色在给定的情节中相互交谈。
这将在 Dash 应用程序中显示,允许用户select 下拉列表中的 4 个参数:季节、剧集、角色 1 和角色 2。
到目前为止,这是我的代码的相关片段:
#Import libraries
import pandas as pd
import numpy as np
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State
#Load data
sheet_url = 'https://docs.google.com/spreadsheets/d/18wS5AAwOh8QO95RwHLS95POmSNKA2jjzdt0phrxeAE0/edit#gid=747974534'
url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')
df = pd.read_csv(url)
#Set parameters
choose_season = df['season'].unique()
choose_episode = df['episode'].unique()
choose_character = ['Andy','Angela', 'Darryl', 'Dwight', 'Jan', 'Jim','Kelly','Kevin','Meredith','Michael','Oscar','Pam','Phyllis','Roy','Ryan','Stanley','Toby']
#Define app layout
app = dash.Dash()
server = app.server
app.layout = html.Div([
dbc.Row([
dbc.Col(
dcc.Dropdown(
id='dropdown1',
options=[{'label': i, 'value': i} for i in choose_season],
value=choose_season[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown2',
options=[{'label': i, 'value': i} for i in choose_episode],
value=choose_episode[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown3',
options=[{'label': i, 'value': i} for i in choose_character],
value=choose_character[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown4',
options=[{'label': i, 'value': i} for i in choose_character],
value=choose_character[1]
), width=3
)
])
])
if __name__=='__main__':
app.run_server()
为了让这项工作更高效,我想在下拉菜单中添加以下依赖项:
1.) 第一个下拉菜单的selection更新了下拉菜单
即:季节更新可能的剧集
2.) 前两个下拉菜单的 selection 更新第三个和第四个下拉菜单
即:季节,剧集更新可能的角色(如果角色不在该剧集中,则不会出现)
3.) 第三个下拉菜单的selection更新第四个下拉菜单
即:如果一个字符在第三个下拉菜单中被 selected,则它们不能在第四个下拉菜单中被 selected(不能 select 相同的字符两次)
我知道这样做的一种方法是制作大量的季到剧集字典,然后制作更大的季到剧集到角色字典。
我已经编写了处理从季到集字典的代码:
@app.callback(
Output('dropdown2', 'options'), #--> filter episodes
Output('dropdown2', 'value'),
Input('dropdown1', 'value') #--> choose season
)
def set_episode_options(selected_season):
return [{'label': i, 'value': i} for i in season_episode_dict[selected_season]], season_episode_dict[selected_season][0]
我绝对可以建立这些词典,但这似乎是一种非常低效的时间利用。有谁知道只需几行代码就可以构建这些词典的方法吗?不确定如何以最简单的方式构建这些。另外,如果您有更好的方法来解决这个问题,也请告诉我。
如有任何帮助,我们将不胜感激!谢谢!
我想我现在明白你在问什么了。像这样的东西应该给你一个基本的字典,然后你可以修改下拉菜单的 options
参数。
df = pd.read_csv(url)
season_episode_character_dictionary = {}
for season in df['season'].unique.tolist():
df_season = df[df['season'].eq(season)]
season_episode_character_dictionary[season] = {}
for episode in df_season['episode'].unique.tolist():
df_episode = df_season[df_season['episode'].eq(episode)]
characters = df_episode['characters'].unique.tolist()
season_episode_character_dictionary[season][episode] = characters
我正在做一个 NLP 项目,分析 The Office 中角色所说的话。该项目的一部分涉及制作网络图,其中角色在给定的情节中相互交谈。
这将在 Dash 应用程序中显示,允许用户select 下拉列表中的 4 个参数:季节、剧集、角色 1 和角色 2。
到目前为止,这是我的代码的相关片段:
#Import libraries
import pandas as pd
import numpy as np
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State
#Load data
sheet_url = 'https://docs.google.com/spreadsheets/d/18wS5AAwOh8QO95RwHLS95POmSNKA2jjzdt0phrxeAE0/edit#gid=747974534'
url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')
df = pd.read_csv(url)
#Set parameters
choose_season = df['season'].unique()
choose_episode = df['episode'].unique()
choose_character = ['Andy','Angela', 'Darryl', 'Dwight', 'Jan', 'Jim','Kelly','Kevin','Meredith','Michael','Oscar','Pam','Phyllis','Roy','Ryan','Stanley','Toby']
#Define app layout
app = dash.Dash()
server = app.server
app.layout = html.Div([
dbc.Row([
dbc.Col(
dcc.Dropdown(
id='dropdown1',
options=[{'label': i, 'value': i} for i in choose_season],
value=choose_season[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown2',
options=[{'label': i, 'value': i} for i in choose_episode],
value=choose_episode[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown3',
options=[{'label': i, 'value': i} for i in choose_character],
value=choose_character[0]
), width=3
),
dbc.Col(
dcc.Dropdown(
id='dropdown4',
options=[{'label': i, 'value': i} for i in choose_character],
value=choose_character[1]
), width=3
)
])
])
if __name__=='__main__':
app.run_server()
为了让这项工作更高效,我想在下拉菜单中添加以下依赖项:
1.) 第一个下拉菜单的selection更新了下拉菜单 即:季节更新可能的剧集
2.) 前两个下拉菜单的 selection 更新第三个和第四个下拉菜单 即:季节,剧集更新可能的角色(如果角色不在该剧集中,则不会出现)
3.) 第三个下拉菜单的selection更新第四个下拉菜单 即:如果一个字符在第三个下拉菜单中被 selected,则它们不能在第四个下拉菜单中被 selected(不能 select 相同的字符两次)
我知道这样做的一种方法是制作大量的季到剧集字典,然后制作更大的季到剧集到角色字典。
我已经编写了处理从季到集字典的代码:
@app.callback(
Output('dropdown2', 'options'), #--> filter episodes
Output('dropdown2', 'value'),
Input('dropdown1', 'value') #--> choose season
)
def set_episode_options(selected_season):
return [{'label': i, 'value': i} for i in season_episode_dict[selected_season]], season_episode_dict[selected_season][0]
我绝对可以建立这些词典,但这似乎是一种非常低效的时间利用。有谁知道只需几行代码就可以构建这些词典的方法吗?不确定如何以最简单的方式构建这些。另外,如果您有更好的方法来解决这个问题,也请告诉我。
如有任何帮助,我们将不胜感激!谢谢!
我想我现在明白你在问什么了。像这样的东西应该给你一个基本的字典,然后你可以修改下拉菜单的 options
参数。
df = pd.read_csv(url)
season_episode_character_dictionary = {}
for season in df['season'].unique.tolist():
df_season = df[df['season'].eq(season)]
season_episode_character_dictionary[season] = {}
for episode in df_season['episode'].unique.tolist():
df_episode = df_season[df_season['episode'].eq(episode)]
characters = df_episode['characters'].unique.tolist()
season_episode_character_dictionary[season][episode] = characters