Dicionários em Python

votos
5

Eu estou tentando obter a velocidade sobre o uso de dicionários. Passei três horas na noite passada pesquisando na web para exemplos semelhantes a algumas das coisas que eu estou tentando fazer. Por exemplo, suponha que eu tenho dois dicionários (na verdade eu tenho duas listas de dicionários).

d1={key1:1, key2:2}
d2={key1:1, key2:'A', key4:4}

Quero atualizar d1 para que ele se parece com o seguinte:

d1={key1:1, key2:[2,'A'], key3:3, key4:4}

Ii não consigo encontrar exemplos adequados para me iniciado. Eu tenho um bom número de livros e eu também analisou-los, mas todos eles parecem ter o mesmo tipo de exemplos que eu estou encontrando na web.

Alguém sabe de um lugar ou de um livro que tem exemplos explícitos e descrições de como usar dicionários?

Eu acho que um dos problemas que estou tendo é que eu não estou entendendo como as referências são mantidos como eu acessar o dicionário.

I pode verificar para ver se os dois dicionários têm uma chave comum:

for k in d1.keys():
    for k2 in d2.keys():
        if k==k2:
            print 'true'

mas se eles fizerem isso eu não consigo para combinar os valores em uma lista.

Mais do que uma resposta direta a este exemplo particular, eu gostaria de receber quaisquer sugestões acerca dos locais onde existem bons exemplos de uso de dicionários.

Publicado 10/03/2009 em 18:34
fonte usuário
Em outras línguas...                            


9 respostas

votos
14

Tente isto:

import collections
merged = collections.defaultdict(list)
for k in d1:
   merged[k].append( d1[k] )
for k in d2:
   merged[k].append( d2[k] )

Este pode ser o que você está procurando.

Ou possivelmente isso.

import collections
merged = collections.defaultdict(set)
for k in d1:
   merged[k].add( d1[k] )
for k in d2:
   merged[k].add( d2[k] )
Respondeu 10/03/2009 em 18:37
fonte usuário

votos
6

Um bom lugar para começar é pela obtenção de ipython ( easy_install ipython), em seguida, bisbilhotando com a conclusão de tabulação, ?e dir:

In [2]: dir {}
------> dir({})

Out[2]: 
['__class__',
 ...
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values']

In [3]: {}.update?
Type:       dict
Base Class: <type 'dict'>
String Form:    {}
Namespace:  Interactive
Length:     0
Docstring:
    dict() -> new empty dictionary.
    dict(mapping) -> new dictionary initialized from a mapping object's
        (key, value) pairs.
    dict(seq) -> new dictionary initialized as if via:
        d = {}
        for k, v in seq:
            d[k] = v
    dict(**kwargs) -> new dictionary initialized with the name=value pairs
        in the keyword argument list.  For example:  dict(one=1, two=2)

(Apenas para exemplo)

De qualquer forma, o seu problema com a verificação de chaves comuns entre os dois dicionários: há algumas coisas a considerar (talvez olhar para a setclasse?), Mas aqui está como eu faria isso:

common_keys = [k for k in dict1 if k in dict2]

(isto é, "cada tecla kno dict1 se essa chave também está em dict2") (nota, também, que os testes de adesão dicionário é um O (1) operação, de modo que este será executado em O (| dict1 |))

edição : tudo bem, então isso não resolve o problema de fundir as duas dicts em um com listas ... Mas a resposta de Lott é bom para isso, ou você pode usar o setdefaultmétodo:

new = {}
for (k, v) in dict1.items():
    new.setdefault(k, []).append(v)
for (k, v) in dict2.items():
    new.setdefault(k, []).append(v)
Respondeu 10/03/2009 em 18:49
fonte usuário

votos
4

Eu acredito que aqui está o que você quer:

>>> d1={'key1':1, 'key2':2}
>>> d2={'key1':1, 'key2':'A', 'key4':4}
>>> d = {}
>>> d.update(d1)
>>> for i in d2:
        if i in d and d2[i] != d[i]:
            d[i] = [d[i], d2[i]]
        else:
            d[i] = d2[i]            
>>> d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}
Respondeu 10/03/2009 em 18:55
fonte usuário


votos
1

dicionários Python também funcionam como arrays associativos em PHP, se você tem alguma experiência nesse idioma.

A página Tipos Built-in nos docs Python também tem uma boa seção sobre dicionários, ea seção também tem uma lista de funções disponíveis para eles:

http://docs.python.org/library/stdtypes.html#mapping-types-dict

Respondeu 10/03/2009 em 18:42
fonte usuário

votos
0

Aqui é uma outra variação.

d1 = {'key1'=1, 'key2'=2}
d2 = {'key1'=1, 'key2'='A', 'key4'=4)
d = d2
for k, v in d.iteritems():
... if k in d1.keys() and v!=d1[k]:
... d[k] = [d1[k], v2]
d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}
Respondeu 23/02/2010 em 16:27
fonte usuário

votos
0

Talvez este é um pouco estranho para fazer, porque a estrutura de dados que você está tentando criar não é tão natural quanto poderia ser. Por exemplo, em vez de ter alguns valores a valores solitários, e alguns ser listas, por que não manter tudo em listas? Por exemplo

{'key1': [1], 'key2': [2, 'A'], 'key4': [4]}

É possível em Python para ter uma coleção de tipos de dados mistos, mas seu código, muitas vezes, ser mais limpo, se você mantê-lo coerente. Se você usar esse tipo de estrutura de dados, inserção é tão fácil como

# Inserting a (key, value) pair
if key in my_dict:
    my_dict[key].append(value)
else:
    my_dict[key] = [value]
Respondeu 11/03/2009 em 02:40
fonte usuário

votos
0

Uma variação resposta de @ SilentGhost (todas as outras respostas produzir dicionários erradas):

>>> d1 = dict(key1=1, key2=2)
>>> d2 = dict(key1=1, key2='A', key4=4)
>>> d = dict(d1)
>>> for k, v2 in d2.iteritems():
...     v = d.get(k, None)
...     d[k] = [v, v2] if v is not None and v != v2 else v2
...
>>> d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}
Respondeu 10/03/2009 em 21:30
fonte usuário

votos
0

bem, para o seu primeiro caso, você pode querer um ajudante que combina dois objetos em uma lista de dois objetos, e duas listas em uma única lista contendo itens das duas listas,

Isso supõe, é claro, que você sempre fundir chaves em listas, mas você não quer que suas chaves para acabar por ser "listas de listas"

def listify( obj ): 
   if type(obj) != type([]): return [obj]
   else: return obj

def merge( v1, v2 ):
    return listify(v1) + listify(v2)

#so now you can merge two dictionaries:
dict1 = dict(a = 2, b = 5, c = 7 )
dict2 = dict(b = 4, d = 9, f = 10 )
dikt = {}

for k in set( dict1.keys() + dict2.keys() ):
    dikt[k] = merge( dict1.get(k, []), dict2.get(k, []) )
#resutls in:
# {'a': [2], 'c': [7], 'b': [5, 4], 'd': [9], 'f': [10]}

Você pode notar, dict.keys()retorna uma lista de chaves, setretorna uma lista sem itens duplicados, então set( d1.keys(), d2.keys() )retorna a união das chaves de D1 e D2

Respondeu 10/03/2009 em 19:04
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more