• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

Dicionarios (des)ordenados

7 mensagens neste tópico

Boas malta! Tou com um pequeno problema.

Tenho um ficheiro de texto com uma dada informação por linha que estou a ler e a querer fazer um dicionario a partir dela. Até ao dicionário chego eu bem:

tempDict = {}
speciesFile = open('quext/species-supported.txt')
speciesSupported = speciesFile.readlines()
speciesFile.close()
for line in speciesSupported[1:]:
    tempDict[' '.join(line.split()[0:2])] = line.split()[3]

E depois, quero ordenar o dicionário alfabeticamente:

tempDict = {}
speciesFile = open('quext/species-supported.txt')
speciesSupported = speciesFile.readlines()
speciesFile.close()
for line in speciesSupported[1:]:
    tempDict[' '.join(line.split()[0:2])] = line.split()[3]
keys = tempDict.keys()
keys.sort()
print keys

species2taxid = {}
for key in keys:
    species2taxid[key] = tempDict[key]
    print species2taxid

Para isso crio um novo dicionário (é pequeno por isso nem tem grande problema) através das chaves ordenadas pelo sort do outro. O primeiro print que ali está, devolve-me uma lista, obviamente, perfeitamente ordenada como eu quero. O ciclo for que vem adiante, começa bem, e a meio, fica desorientado e baralha-me o dicionario todo, como vejo pelo segundo print.

Fica aqui o exemplo:

['Apis mellifera', 'Arabidopsis thaliana', 'Bos taurus', 'Caenorhabditis elegans', 'Candida albicans', 'Canis familiaris', 'Chlamydomonas reinhardtii', 'Danio rerio', 'Drosophila melanogaster', 'Escherichia coli', 'Gallus gallus', 'Homo Sapiens', 'Macacca mulatta', 'Mus musculus', 'Pan troglodytes', 'Rattus norvegicus', 'Saccharomyces cerevisiae', 'Schizosaccharomyces pombe', 'Zea mays']
{'Apis mellifera': '7460'}
{'Arabidopsis thaliana': '3702', 'Apis mellifera': '7460'}
{'Bos taurus': '9913', 'Arabidopsis thaliana': '3702', 'Apis mellifera': '7460'}
{'Bos taurus': '9913', 'Arabidopsis thaliana': '3702', 'Apis mellifera': '7460', 'Caenorhabditis elegans': '6239'}
{'Bos taurus': '9913', 'Candida albicans': '5476', 'Arabidopsis thaliana': '3702', 'Apis mellifera': '7460', 'Caenorhabditis elegans': '6239'}
{'Caenorhabditis elegans': '6239', 'Canis familiaris': '9615', 'Bos taurus': '9913', 'Candida albicans': '5476', 'Apis mellifera': '7460', 'Arabidopsis thaliana': '3702'}
{'Caenorhabditis elegans': '6239', 'Canis familiaris': '9615', 'Bos taurus': '9913', 'Candida albicans': '5476', 'Apis mellifera': '7460', 'Arabidopsis thaliana': '3702', 'Chlamydomonas reinhardtii': '3055'}
{'Caenorhabditis elegans': '6239', 'Canis familiaris': '9615', 'Bos taurus': '9913', 'Candida albicans': '5476', 'Apis mellifera': '7460', 'Arabidopsis thaliana': '3702', 'Chlamydomonas reinhardtii': '3055', 'Danio rerio': '7955'}

Alguém explica este comportamento?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É a primeira linha do output que ali está:

['Apis mellifera', 'Arabidopsis thaliana', 'Bos taurus', 'Caenorhabditis elegans', 'Candida albicans', 
'Canis familiaris', 'Chlamydomonas reinhardtii', 'Danio rerio', 'Drosophila melanogaster', 'Escherichia coli', 'Gallus gallus', 'Homo Sapiens', 
'Macacca mulatta', 'Mus musculus', 'Pan troglodytes', 'Rattus norvegicus', 'Saccharomyces cerevisiae', 'Schizosaccharomyces pombe', 'Zea mays']

Já agora, para quem interessar, o ficheiro de texto que estou a ler é este:

Specie Name                Specie Short Name  TaxonomyId

Saccharomyces cerevisiae        sce                4932

Homo Sapiens                    hsa                9606

Pan troglodytes                ptr                9598

Macacca mulatta                mcc                9544

Mus musculus                    mmu                10090

Rattus norvegicus              rno                10116

Canis familiaris                cfa                9615

Bos taurus                      bta                9913

Gallus gallus                  gga                9031

Danio rerio                    dre                7955

Drosophila melanogaster        dme                7227

Apis mellifera                  dame                7460

Caenorhabditis elegans          cel                6239

Arabidopsis thaliana            ath                3702

Zea mays                        ezma                4577

Chlamydomonas reinhardtii      cre                3055

Candida albicans                cal                5476

Schizosaccharomyces pombe      spo                4896

Escherichia coli                eco                562

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não tinha reparado :X

Anyway, o parece-me que isso vem da forma como dict é constituido a nível de memória... Cria um novo tipo de dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alguém explica este comportamento?

Esse comportamento é perfeitamente normal. Presumo que internamente o dicionário seja uma HashTable e portanto ele guarda os elementos através de uso de uma hash. A ordenação do teu dicionário muito provavelmente é baseado pela ordem da hash atribuído a cada elemento.

Wikipedia

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse comportamento é perfeitamente normal. Presumo que internamente o dicionário seja uma HashTable e portanto ele guarda os elementos através de uso de uma hash. A ordenação do teu dicionário muito provavelmente é baseado pela ordem da hash atribuído a cada elemento.

Wikipedia

Exacto. Como já lhe disse a ele pelo IRC, a solução para o problema dele era criar um novo tipo de dados e implementar métodos com underscore para permitir-lhe aceder como se fosse um dict.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também me tinha ocorrido isso. As hashes é que devem "governar" a ordem do dicionário.. enfim.. acabei por depois perceber que até nem precisava desta opção! Mas foi sempre bom para aprender :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora