Digamos que eu tenha uma lista a
em Python cujas entradas mapeiem convenientemente para um dicionário. Cada elemento par representa a chave do dicionário e o seguinte elemento ímpar é o valor
por exemplo,
a = ['hello','world','1','2']
e gostaria de convertê-lo em um dicionário b
, onde
b['hello'] = 'world'
b['1'] = '2'
Qual é a maneira sintaticamente mais limpa de fazer isso?
python
list
dictionary
Mike
fonte
fonte
Respostas:
Se
a
for grande, você provavelmente fará algo como o seguinte, que não cria listas temporárias como a acima.No Python 3, você também pode usar uma compreensão de ditado, mas, ironicamente, acho que a maneira mais simples de fazê-lo será com
range()
elen()
, que normalmente seria um cheiro de código.Portanto, o
iter()/izip()
método ainda é provavelmente o mais Pythonic no Python 3, embora, como observa a EOL em um comentário,zip()
já seja preguiçoso no Python 3, portanto você não precisaizip()
.Se você quiser em uma linha, precisará trapacear e usar um ponto e vírgula. ;-)
fonte
zip(i, i)
, no Python 3, já quezip()
agora retorna um iterador.Resposta simples
Outra opção (cortesia de Alex Martelli - fonte ):
Nota relacionada
Se você tem isso:
e você deseja isso (cada elemento da lista digitando um determinado valor (2 neste caso)):
você pode usar:
fonte
fromkeys
.>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Você pode usar uma compreensão de ditado para isso com bastante facilidade:
Isso é equivalente ao loop for abaixo:
fonte
Algo que eu acho muito legal, que é se a sua lista tiver apenas 2 itens:
Lembre-se, o dict aceita qualquer iterável que contenha uma iterável, onde cada item na iterável deve ser iterável com exatamente dois objetos.
fonte
Pode não ser o mais pitônico, mas
fonte
enumerate
for i, key in enumerate(a[::2]):
. Ainda unpythonic desde o construtor dict pode fazer a maioria do trabalho aqui para vocêfor i, key in enumerate(a[::2]):
abordagem pode funcionar? Os valores do par resultantes seriam0 hello
e1 1
, e não está claro para mim como usá-los para produzir{'hello':'world', '1':'2'}
.enumerate(a)[::2]
Você pode fazer isso muito rápido sem criar matrizes extras, portanto isso funcionará mesmo para matrizes muito grandes:
Se você possui um gerador
a
, melhor ainda:Aqui está o resumo:
fonte
{'hello':'hello','world':'world','1':'1','2':'2'}
)Você também pode fazer assim (string para listar a conversão aqui e depois para o dicionário)
fonte
Também estou muito interessado em ter uma linha para essa conversão, pois essa lista é o inicializador padrão para hash no Perl.
Uma resposta excepcionalmente abrangente é dada neste tópico -
O meu é um novato em Python), usando o Python 2.7 Generator Expressions , seria:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
fonte
Não tenho certeza se isso é pitônico, mas parece funcionar
fonte
tente o código abaixo:
fonte
Você também pode tentar essa abordagem, salvar as chaves e os valores na lista diferente e, em seguida, usar o método dict
resultado:
fonte
fonte