Listas e strings

Table of Contents

1. Introdução

As cadeias de caracteres (strings) são coleções de caracteres organizadas de forma sequencial. Há diversas situações em que é útil organizarmos dados (não apenas caracteres) de forma sequencial, para isso, o Python oferece as listas.

2. Listas

Uma lista em Python pode ser definida com a seguinte sintaxe.

lista = [10, 20, 30, 40, 50]

Em Python, as listas são heterogêneas, isto é, seus elementos podem ser de tipos de dados diferentes (strings, inteiros e números em ponto-flutante, por exemplo).

lista = [10, 'dez', 10.0]

2.1. Operações sobre listas

2.1.1. Imprimindo uma lista

lista = [10, 'dez', 10.0]
print(lista)

2.1.2. O comprimento de uma lista

A função len retorna o comprimento de uma lista.

lista = [10, 'dez', 10.0]
x = len(lista)
print(x)

2.1.3. Acessando um elemento de uma lista

Devido à organização sequencial de listas, é possível acessar um elemento da lista baseado em sua posição (primeiro, segundo, terceiro etc). O primeiro elemento está na posição \(0\) (zero), o segundo na posição \(1\) e assim por diante.

Em Python, as listas começam a partir da posição \(0\). Algumas linguagens de programação utilizam índices começando na posição \(1\) (Fortran, Octave e Julia, por exemplo). Uma carta de Edsger Dijkstra sobre a discussão está disponível neste link.

A posição do elemento que se deseja acessar é indicada utilizando colchetes (vide exemplo a seguir)

lista = [10, 'dez', 10.0]
print(lista[0])

Na implementação de algoritmos é importante ser cuidadoso para não acessar posições inexistentes das listas.

Descomente as linhas do código a seguir, uma por vez, e execute o código. Verifique o que é impresso.

lista = [10, 20, 30, 40, 50]
#print(lista[0])
#print(lista[3])
#print(lista[4])
#print(lista[-1])
#print(lista[-2])
#print(lista[len(lista)])
#print(lista[5])

2.1.4. Adicionando um elemento em uma lista

Para adicionar elementos a listas pode-se utilizar o método insert, que recebe a posição de inserção e o elemento a ser inserido.

lista = [20, 30]
lista.insert(0, 10)
print(lista)

Utilizando a função insert, faça um programa que define uma lista vazia \(L\) e insere números inteiros positivos, fornecidos pelo usuário, na última posição de \(L\) até que seja fornecido o número \(-1\).

A operação de inserir elementos na última posição de uma lista é bastante frequente. Nesses casos, uma opção ao método insert é o método append que insere diretamente na última posição.

Altere o código do exercício anterior para utilizar o método append

2.1.5. Removendo um elemento de uma lista

Há pelo duas opções de remoção, em algumas situações é necessário remover um elemento baseado em sua posição e em outras baseado no conteúdo. Para remover baseado na posição, pode-se utilizar o método pop.

lista = [10, 20, 30, 40, 50]
x = lista.pop(1)
print(f"Elemento removido {x}")
print(lista)

Implemente um código que lê números positivos do usuário até que seja digitado \(-1\), armazene-os em uma lista, e então remova os elementos um a um da lista, cada elemento removido deve ser impresso para o usuário. Os elementos devem ser removidos na mesma ordem em que foram adicionados na lista.

Utilizando a remoção baseada na posição, implemente um código que define uma lista \(L\) com números inteiros positivos, pede ao usuário um valor e então remove aquele valor da lista (se o valor estiver na lista), caso contrário, o código deve imprimir uma mensagem avisando que o valor não está na lista.

Além da remoção baseada na posição, pode-se remover elementos baseado no conteúdo. Para isso, pode-se utilizar o método remove.

lista = [10, 20, 30, 40, 50]
lista.remove(20)
print(lista)

Verifique o que acontece caso o argumento do método remove não esteja presente na lista.

2.2. Verificando se um elemento está na lista

Uma forma de verificar se um elemento está em uma lista é usando o operador in como no trecho a seguir.

x = int(input("Digite um valor: "))
L = [12, 5, 2, 50, 10]
if x in L:
    print(f"{x} presente")
else:
    print(f"{x} ausente")    

2.3. Outros métodos relacionados a listas

  • sort.
  • count.
  • index.
  • clear.
  • reverse.
  • copy.
  • max.
  • min.
  • del.

Pesquisa sobre cada um dos métodos anteriores e faça um exemplo para entender os respectivos comportamentos.

3. Listas, laços e break

É frequente precisarmos iterar sobre listas, isto é, percorrer listas elemento a elemento para verificar uma propriedade. É possível percorrer listas tanto com laços do tipo while quanto do tipo for. Por exemplo, para imprimir uma lista elemento a elemento com laço while, tem-se o seguinte.

lista = [10, 20, 30, 40, 50]
i = 0
while i < len(lista):
    print(lista[i])
    i += 1  # i = i + 1

Note que, neste caso é necessário controlar o índice do elemento com a variável i. Muitas vezes, no entanto, o índice do elemento é secundário e o interesse principal é no elemento em si. Nesses casos, um laço for costuma ser mais conveniente.

lista = [10, 20, 30, 40, 50]
for item in lista:
    print(item)

3.1. Interrompendo um laço

Considere a situação em que foi definida uma coleção de valores em uma lista e é necessário encontrar a posição de um valor nesta lista. Uma possível implementação é a seguinte.

valores = [10, 20, 30, 40, 50]
alvo = 30
alvopos = -1
i = 0
while i < len(valores):
    if valores[i] == alvo:
        alvopos = i
    i += 1

if (alvopos >= 0):
    print(f"Valor {alvo} na posicao {alvopos}")
else:
    print("Alvo nao encontrado")

Note que, uma vez que o valor já tenha sido encontrado, não é mais necessário realizar o laço. Nesse caso, podemos utilizar o comando break para parar sair do laço. Com o comando break o código pode ser alterado para o seguinte.

valores = [10, 20, 30, 40, 50]
alvo = 30
i = 0
while i < len(valores):
    if valores[i] == alvo:
        break
    i += 1

if (i < len(valores)):
    print(f"Valor {alvo} na posicao {i}")
else:
    print("Alvo nao encontrado")

O comando break sempre finaliza o laço mais interno e, embora seja bastante útil, deve ser utilizado apenas quando necessário, pois pode dificultar o entendimento do código. Isso pelo fato de cada comando break desviar o fluxo natural do laço.

Pesquise sobre o comando continue e compare-o com o comando break

4. Strings e alguns métodos

Uma string pode ser vista como uma sequência de caracteres. Diversas funções aplicadas a listas também podem ser aplicadas a strings.

Verifique o que é impresso pelos comandos a seguir.

palavra = "Teste"
print(len(palavra))
print(palavra[0])
print(palavra[-1])

Strings também são objetos iteráveis. Portanto, é possível combiná-las com laços for da seguinte forma.

palavra = "Teste"
for c in palavra:
    print(c)

4.1. Os métodos split e strip

A manipulação de strings é importante em diversos contextos, um deles é o fato do retorno da função input ser uma string. Dois desses métodos são o split e o strip.

O método split separa as diversas as diversas palavras de uma frase em uma lista.

palavra = "Essa e' uma frase"
print(palavra.split())

O método split considera que o espaço é o separador padrão, mas é possível escolher outros separadores, basta fornecê-los como argumento do método.

numeros = "1,2,3,4,5"
print(numeros.split(','))

O método strip auxilia na remoção de caracteres indesejados no início e final da string (como espaços).

palavra = "     teste     "
print(palavra.strip())

5. Fatiamento de listas

Em algumas situações é interessante trabalhar com "fatias" (pedaços) da uma lista. O fatiamento de listas pode ser realizado utilizando a seguinte sintaxe.

L[start:end:step]

Os elementos start e end identificam respectivamente o começo e final da fatia de interesse. O elemento step pode ser omitido e será detalhado mais adiante. Como exemplo, considere o seguinte código.

L = [10, 20, 30, 40, 50, 60, 70, 80]
print(L[2:6])

Note que será impressa a fatia [30, 40, 50, 60]. No caso do elemento step não ser fornecido, a fatia recortada é contínua. Se for necessário, o elemento step pode ser especificado para que sejam pulados elementos periodicamente.

L = [10, 20, 30, 40, 50, 60, 70, 80]
print(L[2:6:2])  # Imprime [30, 50]

Determine o que será impresso pelo código a seguir e, em seguida, implemente o código para conferir sua resposta.

L = range(1, 100)
print(L[10:20])
print(L[10:10])
print(L[1:100])
print(L[100:0:-1])
print(L[100:-1:-1])
print(L[100::-1])
print(L[::-1])

6. Listas de listas de listas de listas…

Os elementos de uma lista podem ser outras listas.

L = [ [1, 2, 3], [3, 4], [6], []]

Uma das grandes utilidades desse raciocínio é a possibilidade de representar estruturas de dados matriciais em um código. Por exemplo, o script a seguir define duas matrizes A e B e realiza a soma matricial \(A+B\), guardando o resultado na própria lista A.

A = [[1, 2, 3],
    [4, 5, 6], 
    [7, 8, 9]]

B = [[2, 3, 2], 
     [-1, -1, -1],
     [0, 2, 1]]    

for i in range(len(A)):
    for j in range(len(A[0])):
        A[i][j] += B[i][j]

Esse mesmo raciocínio pode ser utilizado para matrizes multidimensionais (listas de listas de listas…)

7. Referências e outros materiais

  • Payne, James R. Python for Teenagers: Learn to Program Like a Superhero!. Apress, 2019.

Author: Pedro Belin Castellucci

Created: 2024-05-17 sex 13:04

Validate