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

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

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

Как мне преобразовать это в это?

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

И как мне это преобразовать?

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

person mike    schedule 23.03.2009    source источник
comment
@garej: Учитывая, что x уже является tuple в вашем коде (природа items - производить итерацию из tuples), было бы проще / быстрее просто выполнить [x[::-1] for x in d.items()]; реверсивный срез напрямую создает перевернутый tuple надлежащего размера, вместо того, чтобы конструктор tuple итеративно заполнял (с превышением доступности и изменением размера в конце) tuple из reversed итератора.   -  person ShadowRanger    schedule 28.03.2019
comment
@ShadowRanger, ты прав. Я просто хотел пояснить, что в таких случаях не всегда нужен шаблон k, v.   -  person garej    schedule 28.03.2019
comment
Примечание. добавлен тег compatibility из-за различий в py2.x // py3.x   -  person dreftymac    schedule 02.05.2019


Ответы (11)


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

person Devin Jeanpierre    schedule 23.03.2009
comment
items () возвращает представление dict_keys в python3. Оберните этот вызов приведением к списку list (). См. Ответ @ SilentGhost - person Erich; 12.07.2017

так как никто другой этого не сделал, я добавлю версии 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')]
person SilentGhost    schedule 23.03.2009

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

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

доставит вам [ ('a', 1), ('b', 2), ('c', 3) ] и

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

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

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

person mpeterson    schedule 23.03.2009

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

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

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

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

>>> player = best[0]

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

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

список в случайном порядке или с соблюдением порядка collections.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)
person Remi    schedule 30.08.2011

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

а также

[(v,k) for (k,v) in d.iteritems()]
person Robert Rossney    schedule 23.03.2009
comment
[(k, v) for (k, v) в d.iteritems ()] - ужасный эквивалент d.items () - person Devin Jeanpierre; 23.03.2009

Вам нужны методы dict 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')]
>>> 
person Barry Wark    schedule 23.03.2009

Это критические изменения по сравнению с 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)
person Trect    schedule 30.06.2018

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')]
person Vivek Sable    schedule 15.05.2015
comment
Это сработало для меня как альтернатива collections.OrderedDict(), которая лучше работает с несколькими версиями Python HTTP Requests lib. Хотя мне не нравится, что имя функции zip несколько расплывчатое / перегруженное. - person MarkHu; 14.06.2016
comment
Обратите внимание, что zip-ification не является глубоким приведением, т.е. если есть вложенные дочерние элементы, они не будут затронуты. Возможно, вам придется свернуть собственную рекурсию. - person MarkHu; 14.01.2017

Проще было бы

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples
person Ketan    schedule 31.10.2019

Python3 dict.values() не возвращает список. Это пример

mydict = {
  "a": {"a1": 1, "a2": 2},
  "b": {"b1": 11, "b2": 22}
}

print(mydict.values())
> output: dict_values([{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}])

print(type(mydict.values()))
> output: <class 'dict_values'>

print(list(mydict.values()))
> output: [{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}]

print(type(list(mydict.values())))
> output: <class 'list'>
person Binh Ho    schedule 13.04.2021

person    schedule
comment
Хотя этот код может помочь решить проблему, он не объясняет почему и / или как отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшило бы его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснение, включая применимые ограничения и предположения. - person Toby Speight; 23.08.2016