Как я могу преобразовать словарь Python в список кортежей? - PullRequest
186 голосов
/ 23 марта 2009

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

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

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

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

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

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

Ответы [ 10 ]

328 голосов
/ 23 марта 2009
>>> 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: сохранение порядка вставки для диктов было добавлено в Python 3.7

44 голосов
/ 23 марта 2009

, поскольку никто другой этого не сделал, я добавлю версии 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')]
16 голосов
/ 23 марта 2009

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

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

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

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

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

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

9 голосов
/ 30 августа 2011

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

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

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

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

>>> player = best[0]

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

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

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

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)
6 голосов
/ 23 марта 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')]
>>> 
5 голосов
/ 23 марта 2009
[(k,v) for (k,v) in d.iteritems()]

и

[(v,k) for (k,v) in d.iteritems()]
4 голосов
/ 15 мая 2015

По 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')]
4 голосов
/ 23 марта 2009
>>> a={ 'a': 1, 'b': 2, 'c': 3 }

>>> [(x,a[x]) for x in a.keys() ]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a[x],x) for x in a.keys() ]
[(1, 'a'), (3, 'c'), (2, 'b')]
3 голосов
/ 30 июня 2018

Для Python3.x используйте

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

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

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

Спасибо

3 голосов
/ 23 августа 2016
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
...