Как я могу преобразовать словарь в список кортежей?

219

Если у меня есть словарь, как:

{ 'a': 1, 'b': 2, 'c': 3 }

Как я могу преобразовать это в это?

[ ('a', 1), ('b', 2), ('c', 3) ]

И как я могу преобразовать это в это?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
Майк
источник
7
[tuple(reversed(x)) for x in d.items()]
Гарей,
1
@garej: Учитывая, xчто уже есть tupleв вашем коде (это природа itemsсоздания итерируемого из tuples), было бы проще / быстрее просто сделать [x[::-1] for x in d.items()]; реверсивный срез напрямую создает реверсированный tupleправильный размер, вместо того, чтобы tupleконструктор итеративно заполнял (с перераспределением и изменением размера в конце) a tupleиз reversedитератора.
ShadowRanger
@ ShadowRanger, ты прав. Я просто хотел четко заявить, что k, vв таких случаях не всегда требуется шаблон.
Гарей
Примечание: добавлен compatibilityтег из-за различий py2.x // py3.x
dreftymac

Ответы:

360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

Это не в том порядке, в каком вы хотите, но у диктов нет какого-либо конкретного порядка. 1 Сортируйте это или организуйте это как необходимо.

Смотрите: items () , iteritems ()


В Python 3.x вы бы не использовали iteritems(который больше не существует), а вместо этого использовали items, который теперь возвращает «представление» в словарные элементы. Смотрите документ Что нового для Python 3.0 и новую документацию по представлениям .

1: Сохранение порядка вставки для dicts было добавлено в Python 3.7

Девин Жанпьер
источник
8
items () возвращает представление dict_keys в python3. Оберните этот вызов приведением к списку «list ()». Смотрите ответ @ SilentGhost
Эрих
55

так как никто не сделал, я добавлю версии py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]
SilentGhost
источник
18

Вы можете использовать список понимания.

[(k,v) for k,v in a.iteritems()] 

получит тебя [ ('a', 1), ('b', 2), ('c', 3) ]и

[(v,k) for k,v in a.iteritems()] 

другой пример.

Если хотите, читайте больше о списках , очень интересно, что вы можете с ними сделать.

mpeterson
источник
10

Создать список именованных кортежей

Часто может быть очень удобно использовать namedtuple . Например, у вас есть словарь «имя» в качестве ключей и «оценка» в качестве значений, таких как:

d = {'John':5, 'Alex':10, 'Richard': 7}

Вы можете перечислить элементы в виде кортежей, отсортировать, если хотите, и получить имя и оценку, скажем, игрока с наибольшим количеством очков (индекс = 0), очень Pythonically, как это:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

Как это сделать:

список в случайном порядке или в порядке следования коллекций.OrderedDict :

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

в порядке, отсортированном по значению («оценка»):

import collections
Player = collections.namedtuple('Player', 'score name')

отсортированы с наименьшим количеством баллов:

worst = sorted(Player(v,k) for (k,v) in d.items())

отсортированы с наибольшим количеством баллов:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
Remi
источник
7

То , что вы хотите , это dict«s items()и iteritems()методы. itemsвозвращает список кортежей (ключ, значение). Так как кортежи являются неизменяемыми, их нельзя изменить. Таким образом, вы должны перебирать элементы и создавать новые кортежи, чтобы получить обратные корни (значение, ключ). Для итерации iteritemsпредпочтительнее, поскольку он использует генератор для создания кортежей (ключ, значение), а не для хранения всего списка в памяти.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 
Барри Уарк
источник
6
[(k,v) for (k,v) in d.iteritems()]

и

[(v,k) for (k,v) in d.iteritems()]
Роберт Россни
источник
7
«[(k, v) для (k, v) в d.iteritems ()]» является ужасным эквивалентом d.items ()
Девин Жанпьер
5

Это последние изменения в Python 3.x и Python 2.x

Для использования Python3.x

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Для Python 2.7 используйте

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Tessaracter
источник
4
>>> a = {'a': 1, 'b': 2, 'c': 3}

>>> [(x, a [x]) для x в a.keys ()]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a [x], x) для x в a.keys ()]
[(1, «a»), (3, «c»), (2, «b»)]
исмаил
источник
4

К keys()и values()методы словаря и zip.

zip вернет список кортежей, который действует как упорядоченный словарь.

Демо-версия:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]
Вивек Соболь
источник
Это работает для меня как альтернатива тому, collections.OrderedDict()что лучше работает с несколькими версиями Python HTTP Requests lib. Несмотря на то, что мне не нравится zipназвание функции, оно несколько расплывчатое / перегруженное.
MarkHu
Обратите внимание, что zip-ификация не является «глубоким» приведением, т. Е. Если есть вложенные дети, они не будут затронуты. Возможно, вам придется свернуть свою собственную рекурсию.
MarkHu
3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
Хариш
источник
2
Хотя этот код может помочь решить проблему, он не объясняет, почему и / или как он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшило бы его долгосрочную образовательную ценность. Пожалуйста, измените свой ответ, чтобы добавить объяснение, в том числе какие ограничения и предположения применяются.
Тоби Спейт
3

Проще было бы

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

Второй не проще, но да.

Ketan
источник