Listas do Python

O Python tem um ótimo tipo de lista integrado chamado "list". Os literais de lista são escritos entre colchetes [ ]. As listas funcionam de maneira semelhante às strings. Use a função len() e colchetes [ ] para acessar dados, com o primeiro elemento no índice 0. Consulte os documentos oficiais da lista do python.org.

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

lista de strings 'red' 'blue 'green'

A atribuição com um = nas listas não faz uma cópia. Em vez disso, a atribuição faz com que as duas variáveis aponte para a mesma lista na memória.

  b = colors   ## Does not copy the list

as cores e b apontam para a lista

A "lista vazia" é apenas um par vazio de colchetes [ ]. O "+" funciona para anexar duas listas, então [1, 2] + [3, 4] gera [1, 2, 3, 4] (é igual a + com strings).

FOR e IN

Os construtos *for* e *in* do Python são extremamente úteis, e o primeiro uso deles que vamos mostrar é com listas. O construtor *for* (for var in list) é uma maneira fácil de analisar cada elemento de uma lista (ou outra coleção). Não adicione nem remova itens da lista durante a iteração.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Se você souber que tipo de coisa está na lista, use um nome de variável no loop que capture essas informações, como "num", "name" ou "url". Como o código Python não tem outra sintaxe para lembrar os tipos, os nomes das variáveis são uma maneira importante de manter o controle do que está acontecendo. (isso está um pouco enganoso. À medida que você se familiarizar mais com o Python, vai encontrar referências a dicas de tipo, que permitem adicionar informações de digitação às definições de função. O Python não usa essas dicas de tipo quando executa seus programas. Elas são usadas por outros programas, como ambientes de desenvolvimento integrado (IDEs, na sigla em inglês) e ferramentas de análise estática, como linters/verificadores de tipo, para validar se as funções são chamadas com argumentos compatíveis.

O construtor *in* sozinho é uma maneira fácil de testar se um elemento aparece em uma lista (ou outra coleção). value in collection testa se o valor está na coleção, retornando "True"/"False".

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

As construções for/in são muito usadas no código Python e trabalham em outros tipos de dados além da lista, portanto, basta memorizar a sintaxe. Você pode ter hábitos de outras linguagens em que começa a iterar manualmente uma coleção, mas, no Python, é preciso usar for/in.

Você também pode usar for/in para trabalhar com uma string. A string funciona como uma lista de caracteres, então for ch in s: print(ch) imprime todos os caracteres em uma string.

Intervalo

A função range(n) gera os números 0, 1, ... n-1, e range(a, b) retorna a, a+1, ... b-1 -- até o último número, mas sem incluí-lo. A combinação do laço for e da função range() permite criar um laço numérico tradicional:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

Há uma variante xrange() que evita o custo de criar a lista inteira para casos sensíveis à performance. No Python 3, a função range() tem um bom comportamento de performance, e você pode esquecer a xrange().

Repetição while

O Python também tem a repetição padrão, e as instruções *break* e *continue* funcionam como em C++ e Java, alterando o curso do loop mais interno. As repetições "for/in" acima resolvem o caso comum de iteração de cada elemento de uma lista, mas a repetição "while" oferece controle total sobre os números do índice. Confira um loop while que acessa cada terceiro elemento em uma lista:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

Listar métodos

Confira alguns outros métodos de lista comuns.

  • list.append(elem): adiciona um único elemento ao final da lista. Erro comum: não retorna a nova lista, apenas modifica a original.
  • list.insert(index, elem) -- insere o elemento no índice especificado, deslocando os elementos para a direita.
  • list.extend(list2) adiciona os elementos da lista2 ao final da lista. Usar + ou += em uma lista é semelhante a usar extend().
  • list.index(elem): pesquisa o elemento especificado desde o início da lista e retorna o índice dele. Lança um ValueError se o elemento não aparece (use "in" para verificar sem um ValueError).
  • list.remove(elem): pesquisa a primeira instância do elemento fornecido e a remove (gera um ValueError se não estiver presente).
  • list.sort(): classifica a lista no lugar (não a retorna). A função sorted() mostrada mais adiante é a preferida.
  • list.reverse(): inverte a lista no local (não a retorna)
  • list.pop(index) - remove e retorna o elemento no índice especificado. Retorna o elemento mais à direita se o índice for omitido (aproximadamente o oposto de append()).

Eles são *métodos* em um objeto de lista, enquanto len() é uma função que usa a lista (ou string ou qualquer outra coisa) como argumento.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

Erro comum: os métodos acima não *retornam* a lista modificada, apenas modificam a lista original.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

List Build Up

Um padrão comum é começar uma lista como a lista vazia [] e usar append() ou extend() para adicionar elementos a ela:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

Listar fatias

As fatias funcionam em listas da mesma forma que com strings e também podem ser usadas para mudar subpartes da lista.

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

Exercício: list1.py

Para praticar o material desta seção, tente resolver os problemas em list1.py que não usam classificação (nos Exercícios básicos).