Coleções: Listas Dilvan Moreira
Lembrando ... Acessando um caractere numa String fruit = 'banana' A primeira letra é conseguida através do índice zero. Valor 0 dentro do colchetes. fruit = 'banana' letter = fruit[0] print letter
Lembrando ... A função len retorna o número de caracteres de uma string: fruit = 'banana' print len(fruit)
Lembrando ... Criando sub-Strings: >>> s = 'MontyPython' >>> print s[0:5] Monty >>> print s[5:11] Python
Lembrando ... Strings são imutáveis, >>> greeting = 'Hello, world!' >>> new_greeting = 'J' + greeting[1:] >>> print new_greeting Jello, world!
Objetivos Aprender a usar coleções de dados e seus métodos: Listas. Leitura: do livro “Think Python” Cap. 10
Lista É uma seqüência de valores, onde cada valor é identificado por um índice. O itens de uma lista são chamados elementos. Lista são similares a String Com a diferença que é possível ter uma lista com qualquer tipo de elemento.
Criar uma lista O primeiro exemplo á uma lista de quatro inteiros. [10, 20, 30, 40] ['crunchy frog', 'ram bladder', 'lark vomit'] O primeiro exemplo á uma lista de quatro inteiros. O segundo é uma lista de três strings. Os elementos de uma lista não necessitam ser do mesmo tipo.
Criar uma lista A lista a seguir contém: ['spam', 2.0, 5, [10, 20]] uma string, um valor float, um valor inteiro, e um lista: ['spam', 2.0, 5, [10, 20]] Uma lista dentro de outra lista é dita estar aninhada.
Criar uma lista A função range cria uma lista: >>> range(1,5) [1, 2, 3, 4] Uma lista que não contém nenhum elemento é chamada de lista vazia e o resultado dela será [].
Criar uma lista >>> cheeses = ['Cheddar', 'Edam', 'Gouda'] >>> numbers = [17, 123] >>> empty = [] >>> print cheeses, numbers, empty Saída ['Cheddar', 'Edam', 'Gouda'] [17, 123] []
Listas são Mutáveis Para acessar um elemento da lista é a mesma sintaxe para acessar um caractere de um string >>> cheeses = ['Cheddar', 'Edam', 'Gouda'] >>> print cheeses[0] Cheddar
Listas são Mutáveis O operador colchete pode aparecer em qualquer lugar em uma expressão. Quando ele aparece no lado esquerdo de uma atribuição, ele modifica um dos elementos em uma lista. >>> numbers = [17, 123] >>> numbers[1] = 5 >>> print numbers [17, 5]
Operador in O operador in também funciona com listas. >>> cheeses = ['Cheddar', 'Edam', 'Gouda'] >>> 'Edam' in cheeses True >>> 'Brie' in cheeses False
Operador for O operador for também funciona com listas. cheeses = ['Cheddar', 'Edam', 'Gouda'] for cheese in cheeses: print cheese Funciona bem só para ler os elementos.
Operador for Para atualizar os itens, é necessário percorrer usando um índice. numbers = [1, 3, 6, 4] for i in range(len(numbers)): numbers[i] = numbers[i] * 2
Elementos de uma lista Quantos itens contém a lista acima? 4 Lista = ['sp', 1, ['1', '2', '2'], [1, 2, 3]] Quantos itens contém a lista acima? 4
Concatenação de Listas >>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = a + b >>> print c [1, 2, 3, 4, 5, 6]
Operador * O operador * repete uma lista um número dado de vezes >>> [0] * 4 [0, 0, 0, 0] >>> [1, 2, 3] * 3 [1, 2, 3, 1, 2, 3, 1, 2, 3]
Fatiamento de listas Da mesma forma em que strings. >>> lista = ['a', 'b', 'c', 'd', 'e', 'f'] >>> lista[1:3] ['b', 'c'] >>> lista[:4] ['a', 'b', 'c', 'd']
Fatiamento de listas >>> lista = ['a', 'b', 'c', 'd', 'e', 'f'] >>> lista[3:] ['d', 'e', 'f'] >>> lista[:] ['a', 'b', 'c', 'd', 'e', 'f']]
Método append O Python fornece também métodos que operam sobre listas Por exemplo, adiciona um novo elemento no final de uma lista >>> t = ['a', 'b', 'c'] >>> t.append('d') >>> print t ['a', 'b', 'c', 'd']
Método sort O método sort ordena a lista em ordem crescente. >>> t = ['d', 'c', 'e', 'b', 'a'] >>> t.sort() >>> print t ['a', 'b', 'c', 'd', 'e']
Mapa, filtra e reduzir Para somar todos os números de uma lista: def add_all(t): total = 0 for x in t: total += x return total Nota: total += x é equivalente à total = total + x
Mapa, filtra e reduzir Somando-se os elementos de uma lista: >>> sum(t) 6 Usando a função sum:
Mapa, filtra e reduzir As vezes podemos percorrer uma lista para criar outra Função capitalize_all retorna uma nova lista que contem com strings capitalizadas: def capitalize_all(t): res = [] for s in t: res.append(s.capitalize()) return res
Mapa, filtra e reduzir Outra operação comum é selecionar alguns elementos de um lista e retorna uma sub-lista A função a seguir recebe uma lista de string e retorna uma lista que contém somente as letras maiúsculas: def only_upper(t): res = [] for s in t: if s.isupper(): res.append(s) return res
Deletando elementos Existem diversas maneiras para remover elementos de uma lista Veja a função pop abaixo: >>> t = ['a', 'b', 'c'] >>> x = t.pop(1) >>> print t ['a', 'c'] >>> print x b
Deletando elementos Se você não precisa do valor removido, use o operador del Veja a função del abaixo: >>> t = ['a', 'b', 'c'] >>> del t[1] >>> print t ['a', 'c']
Deletando elementos Se você conhecer o elemento e não souber o indice, use o operador remove Veja a função remove abaixo: >>> t = ['a', 'b', 'c'] >>> t.remove('b') >>> print t ['a', 'c']
Deletando elementos Para remover mais de um elemento, você pode utilizar o del com um pedaço de índices: Veja a função del abaixo: >>> t = ['a', 'b', 'c', 'd', 'e', 'f'] >>> del t[1:5] >>> print t ['a', 'f']
Listas e Strings Uma string é uma seqüência de caracteres Uma lista é uma seqüência de valores Mas uma lista de caracteres não é o mesmo que uma string Converter uma string para uma lista de caracteres: >>> s = 'spam' >>> t = list(s) >>> print t ['s', 'p', 'a', 'm']
Listas e Strings A função anterior quebra uma string em letras, se você quiser quebrar uma string em palavras, veja: >>> s = 'pining for the fjords' >>> t = s.split() >>> print t ['pining', 'for', 'the', 'fjords']
Listas e Strings Um argumento opcional pode ser chamado para delimitar a quebra, seja abaixo: >>> s = 'spam-spam-spam' >>> delimiter = '-' >>> s.split(delimiter) ['spam', 'spam', 'spam']
Listas e Strings Para juntar é preciso uma lista de strings e concatenar os elementos, veja o código abaixo: >>> t = ['pining', 'for', 'the', 'fjords'] >>> delimiter = ' ' >>> delimiter.join(t) 'pining for the fjords'
Objetos e valores Considere as asserções: >>> a = 'banana' >>> b = 'banana' Sabemos que se refere a mesma string, mas não sabemos se referem a mesma seqüência, existem dois casos possíveis:
Objetos e valores No primeiro caso a e b se referem a dois objetos No segundo caso a e b se referem ao mesmo objeto Para verificar se duas variáveis se referem ao mesmo objeto você pode utilizar o operador is: >>> a = 'banana' >>> b = 'banana' >>> a is b True
Objetos e valores No primeiro caso a e b se referem a dois objetos No segundo caso a e b se referem ao mesmo objeto Para verificar se duas variáveis se referem ao mesmo objeto você pode utilizar o operador is: >>> a = 'banana' >>> b = 'banana' >>> a is b True
Objetos e valores No exemplo anterior, python criou apenas um objeto string, e tanto a como b se referem a ele. Quando utilizamos duas listas, ele vai se referir a dois objetos distintos: >>> a = [1, 2, 3] >>> b = [1, 2, 3] >>> a is b False
Aliasing – “apelidando” Se uma se refere a um objeto, atribuindo b = a, dessa forma teremos duas variaveis para o mesmo objeto. >>> a = [1, 2, 3] >>> b = a >>> b is a True
Aliasing – “apelidando” A associação de uma variável com um objeto é chamado de referência Se o objeto referenciado é mutável, as alterações feitas com a variável afeta a outra: >>> a = [1, 2, 3] >>> b = a >>> b[0] = 17 >>> print a [17, 2, 3]
Aliasing – “apelidando” Atenção: Embora este comportamento seja útil, ele pode ser passível de erro. Para objetos imutáveis, como strings, aliasing não é tanto um problema: a = 'banana' b = 'banana' Não se faz diferença se a e b se referem ao mesmo objeto.
Listas de argumentos Funções modificam os conteúdos das listas, delete_head remove o primeiro elemento, veja: def delete_head(t): del t[0] Utilizando: >>> letters = ['a', 'b', 'c'] >>> delete_head(letters) >>> print letters ['b', 'c']
Listas de argumentos É importante distinguir entre as operações que modificam as listas das operações que criam novas! O método append modifica uma lista, as o operador + cria uma nova: >>> t1 = [1, 2] >>> t2 = t1.append(3) >>> print t1 [1, 2, 3] >>> print t2 None
Listas de argumentos >>> t1 = [1, 2] >>> t3 = t1 + [3] >>> print t3 [1, 2, 3] >>> print t1 [1, 2]
Listas de argumentos Esta diferença é importante para quando você escrever uma função que ira modificar uma lista. A função abaixo não exclui a cabeça da lista: def bad_delete_head(t): t = t[1:] #WRONG! Nota: O operador de fatia cria uma nova lista e a atribuição faz t se referir a ela, mas nada que tenha efeito sobre a lista passada pelo argumento!
Listas de argumentos Uma alternativa é escrever uma função que cria e retorna a nova lista. A função tail retorna tudo, menos o primeiro elemento da lista. def tail(t): return t[1:] >>> letters = ['a', 'b', 'c'] >>> rest = tail(letters) >>> print rest ['b', 'c']
Listas de argumentos Exercício: Escreva uma função chamada chop que recebe uma lista e a modifica, removendo primeiro e ultimo elemento, e sem retornar valor.
Perguntas?