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 forma semelhante às strings: use a função len() e colchetes [ ] para acessar os dados, com o primeiro elemento no índice 0. Consulte a documentação da lista de python.org oficial.

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

lista de strings "red" 'azul' verde

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 apontem para a 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 sinal "+" funciona para anexar duas listas, de modo que [1, 2] + [3, 4] resulta em [1, 2, 3, 4] (como + com strings).

FOR e IN

As construções *for* e *in* do Python são extremamente úteis. O primeiro uso delas que vamos ver é com listas. A construção *for*, for var in list, é uma maneira fácil de analisar cada elemento de uma lista (ou outra coleção). Não adicione ou remova 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 o tipo de coisa que 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 forma fundamental de acompanhar o que está acontecendo. (isso está um pouco enganoso. Conforme você ganhar mais exposição ao Python, verá referências a dicas de tipo, que permitem adicionar dicas de digitação informações às suas definições de função. O Python não usa essas dicas de tipo quando é executado 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.)

A construção *in* é 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 você começa a iterar manualmente em uma coleção, em que, em Python, é preciso usar apenas "for/in".

Você também pode usar for/in para trabalhar em uma string. A string atua como uma lista de caracteres, então for ch in s: print(ch) mostra todos os caracteres de 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 de for-loop e a função range() permite criar uma repetição numérica 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 toda a lista para casos sensíveis ao desempenho (em Python 3, range() terá o bom comportamento de desempenho e você pode esquecer de 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. Aqui está uma repetição "while" que acessa todos os três elementos de 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 outros métodos comuns de listagem.

  • list.append(elem) -- adiciona um único elemento ao final da lista. Erro comum: não retorna a nova lista, apenas modifica o original.
  • list.insert(index, elem) -- insere o elemento no índice especificado, deslocando os elementos para a direita.
  • list.extend(list2) adiciona os elementos em list2 ao final da lista. Usar + ou += em uma lista é semelhante a usar extension().
  • list.index(elem) -- procura o elemento especificado do início da lista e retorna seu índice. Lança um ValueError se o elemento não aparece (use "in" para verificar sem um ValueError).
  • list.remove(elem) - procura a primeira instância do elemento especificado e a remove (gera ValueError se não estiver presente)
  • list.sort(): classifica a lista no lugar (não a retorna). É preferível usar a função sort() mostrada depois.
  • 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 (praticamente o oposto de anexe()).

Observe que esses são *métodos* em um objeto de lista, enquanto len() é uma função que usa a lista (ou string ou algo assim) como um 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, eles 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]

Criação da lista

Um padrão comum é iniciar uma lista como a lista vazia [] e, em seguida, usar anexar() ou estender() para adicionar elementos a ela:

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

Listar frações

Os Slices funcionam em listas, assim como nas strings, e também podem ser usados 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, teste os problemas em list1.py que não usam classificação (nos Exercícios básicos).