RISOLTO Estrazione di valore in una lista in un dizionario in un dizionario python

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Hero467

Utente Attivo
Messaggi
695
Reazioni
406
Punteggio
75
Salve a tutti,
so che può suonare complicato, quindi cercherò di spiegarmi meglio:
Python:
emotions_list = {
    'joy': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2'],
    },
    'angy': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    },
    'sadness': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    },
    'fear': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    },
    'disgust': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    }
}

Ho bisogno di generare casualmente una delle due stringhe in 'moods', che sta all'interno di una delle emozioni. Con questa funzione ho generato casualmente una delle emozioni, ma non riesco ad arrivare oltre, all'interno delle emozioni:
Python:
def generate_mood():
        emotion = sample(list(emotions_list), 1)[0]
        parameter = emotions_list[emotion['moods']]

Non ho neanche provato ad eseguire il codice, perché già vs code mi dava errore di sintassi nella seconda riga della funzione.
Come posso fare?
 
Salve a tutti,
so che può suonare complicato, quindi cercherò di spiegarmi meglio:
Python:
emotions_list = {
    'joy': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2'],
    },
    'angy': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    },
    'sadness': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    },
    'fear': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    },
    'disgust': {
        'moods': ['sentence1', 'sentence2'],
        'answers': ['answer1', 'answer2']
    }
}

Ho bisogno di generare casualmente una delle due stringhe in 'moods', che sta all'interno di una delle emozioni. Con questa funzione ho generato casualmente una delle emozioni, ma non riesco ad arrivare oltre, all'interno delle emozioni:
Python:
def generate_mood():
        emotion = sample(list(emotions_list), 1)[0]
        parameter = emotions_list[emotion['moods']]

Non ho neanche provato ad eseguire il codice, perché già vs code mi dava errore di sintassi nella seconda riga della funzione.
Come posso fare?
Se ho ben intepretato la tua richiesta dovrebbe essere qualcosa di questo tipo:
Python:
import random
emotion_key=random.choice(emotion_list.keys())
emotion=random.choice(emotion_list[emotion_key]['moods'])
Se ti desse errori prova a fare il cast list (emotion_list[emotion_key]['moods']) e tiri fuori un elemento
Oppure puoi una volta avuto accesso alla lista puoi generare un numero random che ti funga da indice con randint.
O usare random.choice con un range
Python:
random.choice(range(10, 20))
Ma credo che la prima soluzione sia la più pulita
 
Ho provato tutti i metodi, ma mi da sempre errore. Siccome non ho capito bene la risposta provo a chiarire ulteriormente:
Nel dizionario postato prima ho bisogno di generare casualmente una delle emozioni, cosa che sono riuscito a fare, ho poi bisogno di accedere alla lista corrispondente al 'moods' dell'emozione generata.
Faccio un esempio pratico:
casualmente accedo a 'sadness', e fin qui ci sono. Poi ho bisogno di accedere a 'moods' dentro sadness, ed estrarre casualmente una delle due 'sentence' nella lista di quel 'moods'.
 
Allora joy è a sua volta un dizionario. Quindi per accedere ai valori del moods dovresti fare qualcosa di questo tipo:
Python:
emotions_list['joy']['moods']
A questo punto se la dichiarazione è stata fatta correttamente dovresti accedere ad un oggetto di tipo lista.
Puoi verificarlo con type(emotions_list['joy']['moods'])
il metodo keys() ritorna tutte le chiavi del dizionario. Nel tuo caso sono
'joy', 'angy'.....etc
Il return del metodo è un elenco sul quale puoi fare il cast a list().
A questo punto il metodo random.choice, che va invocato su liste, prenderà casualmente un valore da quelle chiavi.
Adesso il dizionario più interno ha chiavi moods ed answers, pertanto puoi accedere direttamente al valore di moods indicandolo tra parentesi quadre
emotions_list[elemento del random choice]['moods']
Il tuo elemento in realtà è una lista, pertanto hai necessità di invocare nuovamente una scelta casuale nella lista.


Ti posto lo script buttato su in un secondo:
Python:
import random

if __name__ == '__main__':
    emotions_list = {
        'joy': {
            'moods': ['sentence1', 'sentence2'],
            'answers': ['answer1', 'answer2'],
        },
        'angy': {
            'moods': ['sentence1', 'sentence2'],
            'answers': ['answer1', 'answer2']
        },
        'sadness': {
            'moods': ['sentence1', 'sentence2'],
            'answers': ['answer1', 'answer2']
        },
        'fear': {
            'moods': ['sentence1', 'sentence2'],
            'answers': ['answer1', 'answer2']
        },
        'disgust': {
            'moods': ['sentence1', 'sentence2'],
            'answers': ['answer1', 'answer2']
        }
    }
element=random.choice(list(emotions_list.keys()))
print(type(emotions_list[element]['moods']))
single_emotion=random.choice(emotions_list[element]['moods'])
print(str(single_emotion)+ str(" obtained form ")+ str(element))
<class 'list'>
sentence1 obtained form fear
 
Ultima modifica:
Tu hai un dizionario, formato da più dizionari, i cui valori legati alle key sono liste.

Per accedere al valore corrispondente a una chiave in un dict (con cui abbrevierò dizionario per ora) si fa
Python:
dict['key']

con
Python:
emotion_list['joy']

accedi all'attuale valore della key joy, che è a sua volta un dict con chiave-valore. Quindi a questo punto per accedere alla lista dei moods, dovrai ottenere il valore legato alla key moods.

Puoi vederlo su più passaggi così se ti è più chiaro
Python:
joy_dict = emotion_list['joy']
moods_list = joy_dict['moods']

Oppure fare tutto in una volta con
Python:
moods_list = emotion_list['joy']['moods']

Questo di restituirà la lista dei moods ['sentence1', 'sentence2']

Ora con la notazione per le liste (che è la stessa degli array in praticamente ogni linguaggio) potrai accedere al primo valore della lista con
Python:
moods_list[0]

E agli altri valori con gli indici corrispondenti (per il secondo valore usando l'indice 1 e così via...)

Per il metodo random che hai in mente basta che segui le indicazioni di life, prendendo la lista delle key del dict che ti serve con il metodo keys e utilizzando un metodo random per sceglierne una casualmente.
 
È una spiegazione molto più articolata della mia ahaha, con il tempo perdo sempre più la capacità di articolare?
 
Ti sta venendo l'artrosi spiegatizia...

Al ragazzo manca un metodo/metodologia per il debug. Quando l'ide che sto usando non mi permette di seguire riga per riga l'andamento del programma metto un sacco di print nel codice per vedere come sono diventate le mie variabili, che magari mi aspettavo una cosa e invece ho toppato e viene fuori n'altro tipo.
 
Ultima modifica:
È una spiegazione molto più articolata della mia ahaha, con il tempo perdo sempre più la capacità di articolare?

E' solo perchè ci sono passato di recente, dato che ho dovuto fare un progetto in python, e meno male che c'era mio fratello che aveva già smattato coi dict ?
 
Tu hai un dizionario, formato da più dizionari, i cui valori legati alle key sono liste.

Per accedere al valore corrispondente a una chiave in un dict (con cui abbrevierò dizionario per ora) si fa
Python:
dict['key']

con
Python:
emotion_list['joy']

accedi all'attuale valore della key joy, che è a sua volta un dict con chiave-valore. Quindi a questo punto per accedere alla lista dei moods, dovrai ottenere il valore legato alla key moods.

Puoi vederlo su più passaggi così se ti è più chiaro
Python:
joy_dict = emotion_list['joy']
moods_list = joy_dict['moods']

Oppure fare tutto in una volta con
Python:
moods_list = emotion_list['joy']['moods']

Questo di restituirà la lista dei moods ['sentence1', 'sentence2']

Ora con la notazione per le liste (che è la stessa degli array in praticamente ogni linguaggio) potrai accedere al primo valore della lista con
Python:
moods_list[0]

E agli altri valori con gli indici corrispondenti (per il secondo valore usando l'indice 1 e così via...)

Per il metodo random che hai in mente basta che segui le indicazioni di life, prendendo la lista delle key del dict che ti serve con il metodo keys e utilizzando un metodo random per sceglierne una casualmente.
Grazie mille. Seguendo i consigli di @ilfe98 ho risolto alla fine.

Al ragazzo manca un metodo/metodologia per il debug.
Confermo
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top