5

Sto sperimentando con python e sono bloccato cercando di capire i messaggi di errore nel contesto di ciò che sto facendo.Comprensioni con più set di input

Sto giocando intorno con comprensioni e cercando di trovare un modello per creare una lista/comprensione dizionario con più di un ingresso impostato (supponendo che questo è possibile):

Nota: Qui l'ingresso di parola set significa l'area di input della comprensione. Nella notazione setbuilder, da cui Python ha derivato le sue comprensioni [Y per X in LIST], Y è la funzione di output, X è la variabile e LIST è l'insieme di input.

Si supponga Ho il seguente codice di lavoro:

from random import randint 

mydict = {k: 0 for k in range(10)} 
result = {randint(0,9): v + 1 for v in mydict.values()} 

Non sto cercando di fare qualcosa di speciale. Questo codice non è nemmeno utile perché non funzionerà come previsto. Tutti gli elementi nel dizionario avranno il valore 1, anziché solo quelli puntati dal generatore casuale. Il mio unico obiettivo è avere una base da cui inizio il mio tentativo di lavorare con una tupla di set di input.

from random import randint 

mydict = {k: 0 for k in range(10)} 
result = {k: v + 1 for k, v in (randint(0,9), mydict.values())} 

Questa opzione mi dà: TypeError: 'int' object is not iterable.

Scambiando i set di ingresso e di disimballaggio ho:

result = {k: v + 1 for *v, k in (mydict.values(), randint(0,9))} 

Ma questa opzione mi dà: TypeError: can only concatenate list (not "int") to list

Sono questi errori che compaiono perché sto cercando di fare qualcosa di grammatica lingua non capisce, o mi manca qualcosa e potrei in effetti risolvere il codice?

+4

non è chiaro quello che in uscita si aspetta * *. Di ''randint (0,9)' ha restituito 3; quale risultato vorresti? – DSM

+0

Vuoi un dtt con i tasti da 'range (10)' e valori casuali da 'randint'? – Navith

+1

Voi gente siete focalizzati sull'intenzione del codice. L'unica intenzione qui è vedere se c'è un modo per avere una tupla di insiemi di input in una comprensione. Il codice è solo la mia base per la sperimentazione. –

risposta

7

Dovrai creare una comprensione separata per i numeri casuali, così com'è attualmente, hai solo un numero casuale. Inoltre, sarà quindi necessario comprimere i risultati per ottenere un'entità combinata:

>>> from random import randint 
>>> mydict = {k: 0 for k in range(10)} 
>>> result = {k: v + 1 for k, v in zip([randint(0,9) for _ in range(10)] , mydict.values())} 
>>> result 
{2: 1, 3: 1, 4: 1, 5: 1, 8: 1, 9: 1} 

Nota che, poiché il vostro dict iniziale ha il valore 0 per tutti i suoi tasti, tutti i valori nei dict risultato sono 1 (0+1) .

Inoltre, poiché stiamo rendendo i tasti casuali, è possibile che si verifichino sovrapposizioni (ad esempio, 2 è stato generato due volte), ecco perché non vediamo tutte le chiavi nel dizionario result.

Come @wim nota nei commenti qui sotto, un modo migliore per generare questo dizionario risultato sarebbe quello di utilizzare:

>>> {randint(0,9): v+1 for v in mydict.values()} 
{0: 1, 1: 1, 2: 1, 3: 1, 6: 1, 7: 1} 
+2

Questo è uno strano modo di andare a proposito. Puoi anche inserire randint (0, 9) come k e includere solo la v nella comprensione. – wim

+1

@wim Proprio così, ero concentrato nel dire all'OP cosa c'è di sbagliato nel codice corrente ... –

+1

Questo è incredibile, mu! Grazie per avermi aiutato a trovare dove stavo sbagliando. @wim, questo è solo un esperimento. La vera intenzione era cercare di trovare un modo per avere una tupla di set di input –

Problemi correlati