кортеж пітона для диктування


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])). Це повільніше, брудніше і використовує набагато більше пам'яті.
kevpie

@kevpie Чудова річ у Python полягає в тому, що існує сто способів висловити, як щось зробити, кожен настільки ж цікавий, як і наступний.
bjd2385

Чудово, якщо у вас є трійка, яку ви можете зробити: dict((x, y) for x, y, z in t)або dict((x, (y, z)) for x, y, z in t)отримати друге і третє значення як кортеж.
відвід

Дуже швидко, всебічно і просто. Ідеальна відповідь.
gies0r

73

Трохи простіший метод:

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

1
що робить це швидше?
maazza

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

Я не бачу, як відповісти на це питання ОП
Лука Амеріо

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.