在 Python 中定义依赖字典

问题描述 投票:0回答:1

我正在开展一个 NLP 项目,分析办公室中人物所说的话。该项目的一部分涉及制作一个网络图,其中角色在给定的剧集中相互交谈。

这将在 Dash 应用程序中显示,允许用户选择 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.) 选择第一个下拉菜单会更新下拉菜单 即:季节更新可能的剧集

2.) 前两个下拉菜单的选择将更新第三个和第四个下拉菜单 即:季节,剧集更新可能的角色(如果角色不在该剧集中,则他们不会出现)

3.) 选择第三个下拉菜单会更新第四个下拉菜单 即:如果在第三个下拉菜单中选择了某个字符,则无法在第四个下拉菜单中选择该字符(不能选择同一字符两次)

我知道做到这一点的一种方法是制作一个庞大的季节到剧集字典,然后制作一个更大的季节到剧集到角色字典。

我已经编写了处理季节到剧集字典的代码:

@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]

我绝对可以构建这些词典,但这似乎是对时间的低效利用。有谁知道只需几行代码即可构建这些字典的方法?不知道如何以最简单的方式构建这些。另外,如果您有更好的方法来解决这个问题,也请告诉我。

python dictionary plotly-dash key-value dashboard
1个回答
1
投票

我想我现在明白你在问什么了。像这样的东西应该会给你一个基本的字典,然后你可以修改下拉列表的

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
© www.soinside.com 2019 - 2024. All rights reserved.