2010-08-11 11 views
7

Ho definito una tupla così: (slot, GameID, bitrate)Modo elegante per creare un dizionario di coppie, da un elenco di tuple?

e creato un elenco di loro chiamato myListOfTuples. In questo elenco potrebbero essere presenti tuple contenenti lo stesso gameid.

E.g. la lista può apparire come:

[ 
    (1, "Solitaire", 1000), 
    (2, "Diner Dash", 22322), 
    (3, "Solitaire", 0), 
    (4, "Super Mario Kart", 854564), 
    ... and so on. 
] 

Da questa lista, ho bisogno di creare un dizionario di coppie - (gameId, bitrate), dove il bitrate per quella gameId è il primo che mi sono imbattuto per quel particolare gameId in myListOfTuples.

E.g. Dall'esempio precedente, il dizionario delle coppie conterrebbe solo una coppia con gameId "Solitaire": ("Solitaire", 1000) perché 1000 è il primo bitrate trovato.

NB. Posso creare un set di giochi unici con questo:

uniqueGames = set((e[1] for e in myListOfTuples)) 

risposta

10

Per python2.6

dict(x[1:] for x in reversed(myListOfTuples)) 

Se avete Python2.7 o 3.1, è possibile utilizzare la risposta di katrielalex

4
{ gameId: bitrate for _, gameId, bitrate in reversed(myListOfTuples) }.items() 

(questa è una visione, non una serie Ha operazioni setlike, ma se avete bisogno di un set, il cast a uno..)

Sei sicuro di volere un set, non un dizionario di gameId: bitrate? Quest'ultima mi sembra una struttura dati più naturale per questo problema.

+0

Grazie katrielalex - ottengo un errore di sintassi appena dopo il 'for'. Perché il 'invertito'? – BeeBand

+2

Il 'invertito' è perché l'assegnazione ripetuta del dizionario alla stessa chiave sovrascrive il suo valore; vogliamo il * primo * valore nella lista, quindi andiamo all'indietro. Presumo che tu stia usando Python 2.x, dal momento che le comprensioni del dizionario sono nuove per Py3k. Puoi fare la stessa cosa con un generatore, anche se è un po 'disordinato. Fissaggio. – katrielalex

+0

Vedo. Sì, un dizionario sarebbe più utile in realtà. – BeeBand

Problemi correlati