É possível criar uma compreensão de dicionário em Python (para as chaves)?
Sem compreensão de lista, você pode usar algo como isto:
l = []
for n in range(1, 11):
l.append(n)
Nós podemos encurtar este a uma compreensão da lista: l = [n for n in range(1, 11)]
.
No entanto, digamos que desejo definir as chaves de um dicionário com o mesmo valor. Eu posso fazer:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
Eu tentei isso:
d = {}
d[i for i in range(1, 11)] = True
No entanto, eu recebo um SyntaxError
no for
.
Além disso (eu não preciso desta parte, mas apenas imaginando), você pode definir as chaves de um dicionário com vários valores diferentes, como este:
d = {}
for n in range(1, 11):
d[n] = n
Isso é possível com a compreensão de um dicionário?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
Isso também gera um SyntaxError
no for
.
python
dictionary
list-comprehension
Rushy Panchal
fonte
fonte
Respostas:
Existem compreensões de dicionário no Python 2.7+ , mas elas não funcionam da maneira que você está tentando. Como uma compreensão de lista, eles criam um novo dicionário; você não pode usá-los para adicionar chaves a um dicionário existente. Além disso, é necessário especificar as chaves e os valores, embora, é claro, você possa especificar um valor simulado, se quiser.
Se você deseja defini-los todos como True:
O que você parece estar pedindo é uma maneira de definir várias chaves ao mesmo tempo em um dicionário existente. Não há atalho direto para isso. Você pode fazer um loop como você já mostrou, ou usar uma compreensão de dicionário para criar um novo ditado com os novos valores e, em seguida, fazer
oldDict.update(newDict)
a mesclagem dos novos valores no antigo ditado.fonte
dict.update
também pode aceitar um iterável de pares chave-valor como odict
construtordict.fromkeys()
. Portanto, para definir todos os valoresTrue
, usedict.fromkeys(range(5), True)
. Cuidado, o valor não é copiado ; portanto, você pode evitar isso quando tiver um valor mutável; será compartilhado entre todas as chaves.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Tanto pode ser feito na mesma expressão:{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Você pode usar o
dict.fromkeys
método de classe ...Essa é a maneira mais rápida de criar um dicionário onde todas as chaves são mapeadas para o mesmo valor.
Mas não não usar isso com objetos mutáveis :
Se você realmente não precisa inicializar todas as chaves, a também
defaultdict
pode ser útil:Para responder à segunda parte, uma compreensão de ditado é exatamente o que você precisa:
Você provavelmente não deve fazer isso, mas também pode criar uma subclasse
dict
que funciona como umdefaultdict
se você substituir__missing__
:fonte
d = defaultdict(lambda: True)
, o lambda não é necessário, pois True é (ou não deveria) ser mutável.fonte
Gosto muito do comentário do @mgilson, já que se você tiver dois iterables, um que corresponda às chaves e o outro aos valores, também poderá fazer o seguinte.
dando
fonte
{i:j for i in keys for j in values}
Use dict () em uma lista de tuplas, esta solução permitirá que você tenha valores arbitrários em cada lista, desde que tenham o mesmo comprimento
fonte
d = dict(zip(i_s,x_s))
Considere este exemplo de contagem da ocorrência de palavras em uma lista usando compreensão de dicionário
E o resultado é
fonte
O principal objetivo de uma compreensão de lista é criar uma nova lista com base em outra, sem alterar ou destruir a lista original.
Em vez de escrever
ou
você deve escrever apenas
Nos dois blocos de código principais, você está criando uma nova lista, iterando através dela e retornando cada elemento. É apenas uma maneira cara de criar uma cópia da lista.
Para obter um novo dicionário com todas as chaves definidas para o mesmo valor com base em outro ditado, faça o seguinte:
Você está recebendo um SyntaxError porque quando escreve
você está basicamente dizendo: "Defina minha chave 'i para i no intervalo (1, 11)' como True" e "i para i no intervalo (1, 11)" não é uma chave válida, é apenas um erro de sintaxe. Se ditar listas suportadas como chaves, você faria algo como
e não
mas as listas não são hasháveis; portanto, você não pode usá-las como chaves dict.
fonte
você não pode misturar uma lista como essa. tente fazer isso, usa tuplas
fonte