python tuple to dyktować


149

W przypadku krotki t = ((1, 'a'),(2, 'b')) dict(t)zwraca{1: 'a', 2: 'b'}

Czy jest dobry sposób na zdobycie {'a': 1, 'b': 2}(zamiana kluczy i vals)?

Ostatecznie chcę móc zwrócić 1dane 'a'lub 2dane 'b', być może przejście na dyktando nie jest najlepszym sposobem.

Odpowiedzi:


277

Próbować:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

8
+1 Piękny !, musiałem spróbować z zamkiem błyskawicznym dict(zip(*zip(*t)[::-1])). To jest wolniejsze, brzydsze i zużywa znacznie więcej pamięci… prawdopodobnie 3x.
kevpie

@kevpie Cudowną rzeczą w Pythonie jest to, że istnieje sto sposobów wyrażenia tego, jak coś zrobić, każdy równie interesujący jak następny.
bjd2385

Świetnie, jeśli to, co masz, jest potrójne, możesz to zrobić: dict((x, y) for x, y, z in t)lub dict((x, (y, z)) for x, y, z in t)pobrać drugą i trzecią wartość jako krotkę.
guival

Bardzo szybko, kompleksowo i prosto. Doskonała odpowiedź.
gies0r

73

Nieco prostsza metoda:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}

1
co sprawia, że ​​jest to szybsze?
maazza

9
Funkcje map i dict są zaimplementowane w C i są znacznie szybsze niż jakakolwiek wersja Pythona
jterrace

1
Podoba mi się to, że reversezostało wyraźnie określone.
Frerich Raabe

4
@maazza: generalnie testy wydajności sugerują, że (przynajmniej w implementacji C) mapjest szybsze niż zrozumienie, gdy mapowana rzecz jest kolejną wbudowaną funkcją (np. reversed); w większości innych przypadków jest odwrotnie. Ale lepiej profilować niż zgadywać :)
Karl Knechtel

43

Jeszcze bardziej zwięzłe, jeśli korzystasz z Pythona 2.7:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}

9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Lub:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]

Nie rozumiem, jak ta odpowiedź na pytanie OP
Luca Amerio

4

Jeśli istnieje wiele wartości dla tego samego klucza, poniższy kod dołączy te wartości do listy odpowiadającej ich kluczowi,

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]

2

Oto kilka sposobów na zrobienie tego:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.