在 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