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

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


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

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.


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)

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

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

e

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

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)

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

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

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.