DICIONÁRIOS E ARQUIVOS George Gomes Cabral DICIONÁRIOS Em conjunto com listas, são os tipos de dados internos mais flexíveis no Python. Dados acessados pela chave (key), ao contrário de listas, onde os dados são acessados pela posição (índice). Também chamados de arrays associativos ou tabelas hash. Têm comprimento variável, são heterogêneos e podem ser aninhados arbitrariamente. DICIONÁRIOS São delimitados por : {}. Lista de pares chave valor Exemplos: tel = {'jack': 4098, 'sape': 4139} tel['guido'] = 4127 print tel tel['irv'] = 4127 print tel tel['irv'] = 1234 print tel del tel['sape'] print tel a = tel.keys() print a b = tel.has_key('guido') print b c = tel.has_key('amanda') print c DICIONÁRIOS Mais exemplos: D1 = {} # dicionario vazio D2 = {'spam' : 2, 'eggs' : 3} # dicionario de tamanho = 2 D3 = {'food': {'ham': 1, 'egg': 2}} # aninhado print D3['food'] print D3['food']['ham'] print D2.has_key('eggs') print 'eggs' in D2 print "keys", D2.keys() print "values", D2.values() print D2 D2.get('eggs') D2.update(D3) print D2 print len(D2) del D2['eggs'] print D2 MATRIZES COM DICIONÁRIOS Matrix = {} Matrix[(2,3,4)] = 88 Matrix[(7,8,9)] = 99 ... Inicializando uma matriz: m1 = {} i, j = 3, 2 for a in range(0,i): for b in range(0,j): m1[(a,b)] = 0 DICIONÁRIOS Exercício: 1 - Fazer um programa que calcule e exiba a soma de duas matrizes. MATRIZES (SOMA) m1 = {} m2 = {} mRes = {} i, j = 2, 2 l, k = 2, 2 m1[(0,0)] = 1 m1[(0,1)] = 3 m1[(1,0)] = 2 m1[(1,1)] = 0 m2[(0,0)] = 1 m2[(0,1)] = 3 m2[(1,0)] = 2 m2[(1,1)] = 0 for a in range(0,i): for b in range(0,j): mRes[(a,b)] = m1[(a,b)] + m2[(a,b)] print mRes DICIONÁRIOS Exercício: 1 - Fazer um programa que calcule e exiba a multiplicação de duas matrizes. MATRIZES (MULTIPLICAÇÃO) m1 = {} m2 = {} mRes = {} i, j = 3, 2 m1[(0,0)] = 1 m1[(0,1)] = 3 m1[(1,0)] = 2 m1[(1,1)] = 0 m1[(2,0)] = -1 m1[(2,1)] = 4 m2[(0,0)] = 2 m2[(0,1)] = 1 m2[(1,0)] = 3 m2[(1,1)] = 1 for a in range(0,i): for b in range(0,j): mRes[(a,b)] = 0 temp = 0 for a in range(0,i): coluna = 0 for b in range(0,j): coluna += 1 for c in range(0,j): mRes[(a,b)] += m1[(a,c)] * m2[(c,coluna-1)] print mRes Arquivos ARQUIVOS o Opções do Open: (“r” - abrir para entrada, “w” – criar e abrir para saída, “a” – abrir para anexar no final) operação Interpretação output = open(“c:/teste.txt”,”w”) Cria arquivo de saída (“w” significa gravação) input = open(“c:/teste.txt”,”r”) Cria arquivo de entrada (“r” significa leitura) S = input.read() Lê o arquivo inteiro em uma única string S = input.read(N) Lê N byte (1 ou mais) S = input.readline() Lê a próxima linha L = input.readlines() Cria uma lista onde cada elemento é uma linha do arquivo output.write(S) Grava a string S no arquivo output.writelines(L) Grava no arquivo todas as strings da lista L output.close() Fechamento manual do arquivo ARQUIVOS - LEITURA Exemplo – lendo o arquivo inteiro em uma única String. Deve existir um arquivo com conteúdo chamado teste_python.txt localizado em C: arquivo = open("c:\teste_python.txt","r") conteudo = arquivo.read() print conteudo ARQUIVOS - LEITURA Exemplo – lendo linha por linha de um arquivo. Deve existir um arquivo com conteúdo chamado teste_python.txt localizado em C: arquivo = open("c:\teste_python.txt","r") conteudo = arquivo.readline() print conteudo conteudo = arquivo.readline() print conteudo Obs. a cada chamada ao método readline() o objeto arquivo terá uma linha a menos. Dessa forma, se quisermos acessar a primeira linha novamente depois de já termos executado o método readline() temos duas opções: Guardar seu conteúdo em uma variável ou em uma lista de strings para a necessidade de um acesso futuro a esse valor. Abrir novamente o arquivo e executar novamente o readline ARQUIVOS - LEITURA Exemplo – lendo os N primeiros caracteres de um arquivo. Deve existir um arquivo com conteúdo chamado teste_python.txt localizado em C: arquivo = open("c:\teste_python.txt","r") N = 15 conteudo = arquivo.read (N) print conteudo ARQUIVOS - LEITURA Exemplo – lendo todas as linhas de um arquivo e as armazenando em uma lista. Deve existir um arquivo com conteúdo chamado teste_python.txt localizado em C: arquivo = open("c:\teste_python.txt","r") conteudo = arquivo.readlines() print conteudo #conteudo é uma lista onde #cada elemento dessa lista é #uma linha do arquivo ARQUIVOS - GRAVAÇÃO Exemplo – gravando uma String em um arquivo. Se já houver algum conteúdo nesse arquivo esse conteúdo será perdido. arquivo = open("c:\teste_python2.txt",“w") conteudo = “ser ou não ser, eis a questão” arquivo.write(conteudo) Obs. se quisermos gravar o conteúdo no final do arquivo devemos mudar a opção de abertura do arquivo (na primeira linha de código) de “w” para “a”. ARQUIVOS - GRAVAÇÃO Exemplo – gravando uma lista de Strings em um arquivo. Se já houver algum conteúdo nesse arquivo esse conteúdo será perdido. arquivo = open("c:\teste_python2.txt",“w") conteudo = “ser ou não ser, eis a questão” arquivo.write(conteudo) Obs. se quisermos gravar o conteúdo no final do arquivo devemos mudar a opção de abertura do arquivo (na primeira linha de código) de “w” para “a”. TRATAMENTO DE STRINGS Se quisermos gravar um arquivo onde cada String se localize em uma linha diferente, devemos manualmente inserir o símbolo de quebra de linha. Por exemplo: “ser ou não ser,\neis a questão” O símbolo “\n” indica que a string eis a questão deve ser escrita em outra linha. Função rsplit() Gera uma lista de Strings onde cada elemento é uma String usando o argumento passado como delimitador da String. “teste.teste1”.rsplit(".") retorna a lista [“teste”,”teste1”] “quando olhei a terra ardendo”.rsplit(" ") retorna a lista [“quando”,”olhei”, “a”,”terra”,”ardendo”] EXERCÍCIOS Dado um arquivo contendo a identidade e o nome de cada pessoa, gere e exiba o conteúdo de um dicionário onde as chaves são as identidades e os valores os nomes. 5384423 4345566 3235574 ... Manoel Alberto Mariana Dados os seguintes endereços IPs, mostre os validos e os inválidos (um endereço ip válido não pode ter uma de suas partes maior que 224). 200.135.80.9 192.168.1.1 8.35.67.74 257.32.4.5 85.345.1.2 1.2.3.4 9.8.234.5 192.168.0.256