кортеж 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}

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}

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}]

Я не понимаю, как этот ответ на вопрос OP
Лука Америо

4

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

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

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}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.