кортеж Python, чтобы диктовать

149

Для кортежа t = ((1, 'a'),(2, 'b')) dict(t)возвращается{1: 'a', 2: 'b'}

Есть ли хороший способ получить {'a': 1, 'b': 2}(ключи и ключи поменялись местами)?

В конечном счете, я хочу иметь возможность вернуть 1данное 'a'или 2данное 'b', возможно, обращение к диктату - не лучший способ.

Джейк
источник

Ответы:

277

Пытаться:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
Грег Хьюгилл
источник
8
+1 Красиво !, мне пришлось попробовать это на молнии dict(zip(*zip(*t)[::-1])). Это медленнее, уродливее и использует намного больше памяти .. вероятно, в 3 раза.
kevpie
@kevpie Замечательно в Python то, что есть сотни способов выразить, как что-то сделать, каждый такой же интересный, как и следующий.
bjd2385
Отлично, если у вас есть тройка, которую вы можете сделать: dict((x, y) for x, y, z in t)или dict((x, (y, z)) for x, y, z in t)получить второе и третье значения в виде кортежа.
Guival
Очень быстро, всесторонне и просто. Идеальный ответ.
gies0r
73

Немного более простой метод:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
jterrace
источник
1
что делает это быстрее?
Маазза
9
Функции map и dict реализованы на C и работают намного быстрее любой версии Python
jterrace
1
Мне нравится это за то, что reverseчетко изложено.
Фрерих Раабе
4
@maazza: в общем, тесты производительности показывают, что (по крайней мере, в реализации C) mapбыстрее, чем понимание, когда отображаемая вещь является другой встроенной функцией (например reversed); в большинстве других случаев верно обратное. Но лучше профилировать, чем догадываться :)
Карл Кнехтель
43

Еще более лаконично, если вы используете Python 2.7:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}
autholykos
источник
9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Или:

>>> [ 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}]
Gunnarsson
источник
Я не понимаю, как этот ответ на вопрос OP
Лука Америо
4

Если существует несколько значений для одного и того же ключа, следующий код добавит эти значения в список, соответствующий их ключу,

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]
PSUN
источник
2

Вот несколько способов сделать это:

>>> 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}
Влад Безден
источник