2010-08-11 10 views
7

Mam zdefiniowane krotki tak: (slot, GameID, bitrate)Elegancki sposób na stworzenie słownika par z listy krotek?

i stworzył listę z nich nazywa myListOfTuples. Na tej liście mogą być krotki zawierające ten sam gameid.

E.g. lista może wyglądać następująco:

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

Z tej listy, muszę utworzyć słownik par - (gameId, bitrate), gdzie bitrate dla tego gameId jest pierwszym, który natknąłem się na tego konkretnego gameId w myListOfTuples.

E.g. Z powyższego przykładu - słownik par zawierałby tylko jedną parę z gameId "Pasjans": ("Solitaire", 1000), ponieważ 1000 jest pierwszą bitrate znalezioną.

NB. Mogę stworzyć zestaw unikatowych gier z tego:

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

Odpowiedz

10

Dla python2.6

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

Jeśli masz Python2.7 lub 3.1, można użyć odpowiedź katrielalex za

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

(To jest widok, a nie zestaw Ma operacje setlike, ale jeśli potrzebujesz zestawu, wrzucił je do jednego.).

Czy na pewno chcesz zestaw, a nie słownik gameId: bitrate? Ten ostatni wydaje mi się bardziej naturalną strukturą danych dla tego problemu.

+0

katrielalex Dzięki - pojawia się błąd składni tuż po 'for'. Dlaczego "odwrócony"? – BeeBand

+2

"Odwrócone" jest, ponieważ powtarzające się przypisanie słownika do tego samego klucza powoduje nadpisanie jego wartości; chcemy mieć * pierwszą * wartość na liście, więc wykonujemy iterację wstecz. Zakładam, że używasz Pythona 2.x, ponieważ słownictwo ze słownika jest nowością w Py3k. Możesz zrobić to samo z generatorem, choć jest trochę bardziej nieporządny. Ustalenie. – katrielalex

+0

Rozumiem. Tak, słownik byłby bardziej przydatny. – BeeBand

Powiązane problemy