Listas do Python

O Python tem um ótimo tipo de lista embutido 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 os colchetes [ ] para acessar os dados, com o primeiro elemento no índice 0. Veja a documentação da lista do python.org (em inglês) oficial.

  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 apontem para a única lista na memória.

  b = colors   ## Does not copy the list

as cores e b indicam a única lista

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

FOR e IN

As construções *for* e *in* do Python são extremamente úteis, e o primeiro uso que veremos é 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 nem 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ê sabe o que está na lista, use um nome de variável no loop que capture essa informação, como "num", "name" ou "url". Como o código Python não tem outra sintaxe para se lembrar dos tipos, os nomes das variáveis são uma maneira fundamental de identificar o que está acontecendo. Isso é um pouco enganoso. À medida que você ganhar mais exposição ao Python, verá 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 ao executar seus programas. Eles são usados por outros programas, como ambientes de desenvolvimento integrados (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* por si só é uma maneira fácil de testar se um elemento aparece em uma lista ou outra coleção (value in collection). Ela testa se o valor está na coleção e retorna Verdadeiro/Falso.

  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 funcionam em tipos de dados diferentes de "list", então você precisa apenas memorizar a sintaxe. Você pode ter hábitos de outras linguagens em que você começa a iterar manualmente em uma coleção e, em Python, precisa usar apenas for/in.

Também é possível usar for/in para trabalhar em uma string. A string age como uma lista de caracteres. Portanto, a for ch in s: print(ch) mostra todos os caracteres dela.

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é, mas não incluindo, o último número. A combinação das funções for-loop e range() permite a criação de um loop numérico tradicional for:

  ## 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 de desempenho (no Python 3, range() terá o bom comportamento de desempenho e você pode esquecer o xrange()).

Repetição while

O Python também tem a repetição "while" padrão. 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 em cada elemento de uma lista, mas a repetição "while" oferece controle total sobre os números do índice. Confira uma repetição "while" que acessa cada terceiro elemento de uma lista:

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

Métodos de lista

Veja 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 de list2 ao final da lista. O uso de + ou += em uma lista é semelhante ao uso de expand().
  • list.index(elem) -- pesquisa o elemento especificado no início da lista e retorna o índice dela. Lança um ValueError se o elemento não aparecer (use "in" para verificar sem um ValueError).
  • list.remove(elem) -- pesquisa 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 scheduled() exibida posteriormente.
  • list.reverse(): inverte a lista atual (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 anexar()).

Observe que esses 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 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, 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]

Criar lista

Um padrão comum é iniciar uma lista como uma lista vazia [] e usar anexar() ou expand() 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 da mesma forma que com strings e também podem ser usados para alterar 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 os problemas de list1.py que não usam classificação (nos Exercícios básicos).