Como posso converter um dicionário em uma lista de tuplas?

218

Se eu tiver um dicionário como:

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

Como posso convertê-lo para isso?

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

E como posso convertê-lo para isso?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
Mike
fonte
7
[tuple(reversed(x)) for x in d.items()]
garej
1
@ garej: Dado que xjá existe tupleno seu código (é da natureza de itemsproduzir um iterável de tuples), seria mais simples / mais rápido fazê-lo [x[::-1] for x in d.items()]; a fatia de reversão constrói diretamente uma reversão tupledo tamanho adequado, em vez de fazer com que o tupleconstrutor preencha iterativamente (com localização geral e redimensionamento no final) a tuplede um reversediterador.
ShadowRanger
@ShadowRanger, você está certo. Eu só queria ser explícito que nem sempre é necessário um k, vpadrão nesses casos.
garej
Nota: adicionado compatibilitytag causa de py2.x // py3.x diferenças
dreftymac

Respostas:

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')]

Não está na ordem que você deseja, mas os ditados não têm nenhuma ordem específica. 1 Classifique ou organize-o conforme necessário.

Veja: items () , iteritems ()


No Python 3.x, você não usaria iteritems(que não existe mais), mas usaria items, que agora retorna uma "visualização" nos itens do dicionário. Consulte o documento O que há de novo para o Python 3.0 e a nova documentação sobre visualizações .

1: A preservação da ordem de inserção para dictos foi adicionada no Python 3.7

Devin Jeanpierre
fonte
7
items () retorna uma visualização dict_keys em python3. Envolva esta chamada com um elenco para uma lista "list ()". Veja a resposta de @ SilentGhost
Erich
54

como ninguém mais o fez, adicionarei versões do 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
fonte
18

Você pode usar a compreensão da lista.

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

vai pegar você [ ('a', 1), ('b', 2), ('c', 3) ]e

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

o outro exemplo.

Leia mais sobre as compreensões de lista, se quiser, é muito interessante o que você pode fazer com elas.

mpeterson
fonte
10

Crie uma lista de nomeados

Muitas vezes, pode ser muito útil usar o nomeado duplo . Por exemplo, você tem um dicionário de 'nome' como chaves e 'pontuação' como valores como:

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

Você pode listar os itens como tuplas, classificados, se quiser, e obter o nome e a pontuação de, digamos, o jogador com a pontuação mais alta (índice = 0), muito pythonicamente assim:

>>> player = best[0]

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

Como fazer isso:

lista em ordem aleatória ou mantendo a ordem das coleções.OrderedDict :

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

em ordem, classificado por valor ('score'):

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

classificados com a menor pontuação primeiro:

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

classificados com a pontuação mais alta primeiro:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
Remi
fonte
7

O que você quer é dict's items()e iteritems()métodos. itemsretorna uma lista de tuplas (chave, valor). Como as tuplas são imutáveis, elas não podem ser revertidas. Portanto, é necessário iterar os itens e criar novas tuplas para obter as tuplas invertidas (valor, chave). Para iteração, iteritemsé preferível, pois usa um gerador para produzir as tuplas (chave, valor) em vez de manter a lista inteira na memória.

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')]
>>> 
Barry Wark
fonte
6
[(k,v) for (k,v) in d.iteritems()]

e

[(v,k) for (k,v) in d.iteritems()]
Robert Rossney
fonte
7
"[(K, v) para (k, v) em d.iteritems ()]" é um terrível equivalente a d.items ()
Devin Jeanpierre
5

Estas são as mudanças mais recentes do Python 3.xe do Python 2.x

Para Python3.x, use

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

Para Python 2.7 use

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Tessaracter
fonte
4
>>> a = {'a': 1, 'b': 2, 'c': 3}

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

>>> [(a [x], x) para x em a.keys ()]
[(1, 'a'), (3, 'c'), (2, 'b')]
ismail
fonte
4

Por keys()e values()métodos de dicionário e zip.

zip retornará uma lista de tuplas que age como um dicionário ordenado.

Demo:

>>> 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')]
Vivek Sable
fonte
Isso funcionou para mim como uma alternativa collections.OrderedDict()àquela que funciona melhor com várias versões do Python HTTP Requests lib. Mesmo que eu não goste do zipnome da função como sendo um pouco vago / sobrecarregado.
21816 MarkHu
Observe que a zip-ification não é uma transmissão "profunda", ou seja, se houver filhos aninhados, eles não serão afetados. Você pode ter que rolar sua própria recursão.
precisa saber é
3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
Harish
fonte
2
Embora esse código possa ajudar a resolver o problema, ele não explica por que e / ou como responde à pergunta. Fornecer esse contexto adicional melhoraria significativamente seu valor educacional a longo prazo. Por favor edite sua resposta para adicionar explicação, incluindo o que limitações e premissas se aplicam.
Toby Speight
2

Um mais simples seria

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

O segundo não é mais simples, mas sim.

Ketan
fonte