Lesson 7
Listas
1. Listas
A maioria dos programas funciona não apenas com variáveis. Eles também usam listas de variáveis. Por exemplo, um programa pode manipular uma informação sobre os alunos em uma aula lendo a lista de alunos do teclado ou de um arquivo. Uma alteração no número de alunos na turma não deve exigir modificação do código-fonte do programa.
Anteriormente, já enfrentávamos a tarefa de processar elementos de uma sequência - por exemplo, ao calcular o maior elemento da sequência. Mas não guardamos toda a sequência na memória do computador. No entanto, em muitos problemas, é necessário manter toda a sequência, como se tivéssemos que imprimir todos os elementos de uma sequência em ordem crescente ("classificar uma sequência").
Para armazenar tais dados, no Python você pode usar a estrutura de dados chamada list (na maioria das linguagens de programação o termo diferente é usado - “array”). Uma lista é uma sequência de elementos numerados de 0, como caracteres da string. A lista pode ser definida manualmente, enumerando os elementos da lista entre colchetes, como aqui:
Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
A lista Primes
tem 6 elementos, a saber: Primes[0] == 2
, Primes[1] == 3
, Primes[2] == 5
, Primes[3] == 7
, Primes[4] == 11
, Primes[5] == 13
. A lista Rainbow
possui 7 elementos, cada um dos quais é a string.
Como os caracteres da string, os elementos da lista também podem ter um índice negativo, por exemplo, Primes[-1] == 13
, Primes[-6] == 2
. O índice negativo significa que começamos no último elemento e vamos para a esquerda ao ler uma lista.
Você pode obter o número de elementos em uma lista com a função len
( comprimento da lista ), por exemplo, len(Primes) == 6
.
Ao contrário das strings, os elementos de uma lista são mutáveis; eles podem ser alterados atribuindo-lhes novos valores.
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'] print(Rainbow[0]) Rainbow[0] = 'red' print('Print the rainbow') for i in range(len(Rainbow)): print(Rainbow[i])
Considere várias maneiras de criar e ler listas. Primeiro de tudo, você pode criar uma lista vazia (a lista sem itens, seu comprimento é 0), e você pode adicionar itens ao final de sua lista usando o append
. Por exemplo, suponha que o programa receba o número de elementos na lista n
e, em seguida, n
elementos da lista um por um cada na linha separada. Aqui está um exemplo de dados de entrada neste formato:
5 1809 1854 1860 1891 1925Nesse caso, você pode organizar a leitura de tal lista da seguinte maneira:
a = [] # iniciar uma lista vazia n = int(input()) # leia o número do elemento na lista for i in range(n): new_element = int(input()) # leia o próximo elemento a.append(new_element) # adicione-o à lista # as duas últimas linhas podem ser substituídas por uma: # a.append (int (input ())) print(a)
No exemplo demonstrado, a lista vazia é criada, o número de elementos é lido, depois você lê os itens da lista linha por linha e acrescenta ao final. A mesma coisa pode ser feita, salvando a variável n
:
a = [] for i in range(int(input())): a.append(int(input())) print(a)
Existem várias operações definidas para listas: concatenação de listas (adição de listas, isto é, "colagem" de uma lista a outra) e repetição (multiplicação de uma lista por um número). Por exemplo:
a = [1, 2, 3] b = [4, 5] c = a + b d = b * 3 print([7, 8] + [9]) print([0, 1] * 3)
A lista resultante c
será igual a [1, 2, 3, 4, 5]
e uma lista de d
será igual a [4, 5, 4, 5, 4, 5]
. Isso permite que você organize o processo de leitura de listas de maneira diferente: primeiro, considere o tamanho da lista e crie uma lista a partir do número desejado de elementos, depois percorra a variável i
começando com o número 0 e dentro do elemento i
-th de leitura de loop da lista:
a = [0] * int(input()) for i in range(len(a)): a[i] = int(input())
Você pode imprimir elementos de uma lista a
com print(a)
; isso exibe os itens da lista entre colchetes e separados por vírgulas. Em geral, isso é inconveniente; em comum, você está prestes a imprimir todos os elementos em uma linha ou um item por linha. Aqui estão dois exemplos disso, usando outras formas de loop:
a = [1, 2, 3, 4, 5] for i in range(len(a)): print(a[i])
Aqui o índice i
é alterado, então o elemento a[i]
é exibido.
a = [1, 2, 3, 4, 5] for elem in a: print(elem, end=' ')
Neste exemplo, os itens da lista são exibidos em uma linha separada por espaços, e não é o índice que é alterado, mas sim o valor da própria variável (por exemplo, no loop for elem in ['red', 'green', 'blue']
variável elem
tomará os valores 'red'
, 'green'
, 'blue'
sucessivamente.
Preste atenção especial ao último exemplo! Uma parte muito importante de ideologia Python é for
loop, que fornece a forma conveniente para repetir todos os elementos de uma sequência. É onde o Python difere do Pascal, onde você tem que percorrer os índices dos elementos, mas não sobre os próprios elementos.
Seqüências em Python são seqüências de caracteres, listas, valores do range()
função range()
(estes não são listas) e alguns outros objetos.
Aqui está um exemplo mostrando o uso do loop for
quando for necessário extrair todos os dígitos de uma string e fazer uma lista numérica deles.
# dado: s = 'ab12c59p7dq' # você precisa extrair dígitos da lista s # para fazer isso: # dígitos == [1, 2, 5, 9, 7] s = 'ab12c59p7dq' digits = [] for symbol in s: if '1234567890'.find(symbol) != -1: digits.append(int(symbol)) print(digits)
2. Dividir e unir métodos
Itens de lista podem ser dados em uma linha separada por um caractere; Nesse caso, a lista inteira pode ser lida usando input()
. Você pode então usar um método de string split()
, que retorna uma lista de strings resultantes após o corte da string inicial por espaços. Exemplo:
# a entrada é uma string # 1 2 3 s = input() # s == '1 2 3' a = s.split() # a == ['1', '2', '3'] print(a)
Se você executar este programa com os dados de entrada de 1 2 3
, a lista a
será igual a ['1', '2', '3']
. Por favor, note que a lista será composta de seqüências de caracteres, não de números. Se você deseja obter a lista de números, você deve converter os itens da lista um por um para inteiros:
a = input().split() for i in range(len(a)): a[i] = int(a[i]) print(a)
Usando a mágica especial de Python - geradores - o mesmo pode ser feito em uma linha:
a = [int(s) for s in input().split()] print(a)
(Vamos explicar como funciona esse código na próxima seção.) Se você quiser ler uma lista de números reais, você tem que alterar o tipo int
para float
.
O método split()
tem um parâmetro opcional que determina qual string será usada como o separador entre os itens da lista. Por exemplo, chamar o método split('.')
Retorna a lista obtida dividindo a cadeia inicial em que o caractere '.'
é encontrado:
a = '192.168.0.1'.split('.') print(a)
No Python, você pode exibir uma lista de strings usando comandos de uma linha. Para isso, o método join
é usado; este método tem um parâmetro: uma lista de strings. Retorna a string obtida pela concatenação dos elementos dados, e o separador é inserido entre os elementos da lista; esse separador é igual à string na qual o método é aplicado. Sabemos que você não entendeu a sentença anterior desde a primeira vez. :) Olhe para os exemplos:
a = ['red', 'green', 'blue'] print(' '.join(a)) # retorno vermelho verde azul print(''.join(a)) # retorno redgreenblue print('***'.join(a)) # retorna vermelho *** verde *** azul
Se uma lista consiste em números, você tem que usar a magia negra dos geradores. Veja como você pode imprimir os elementos de uma lista, separados por espaços:
a = [1, 2, 3] print(' '.join([str(i) for i in a])) # a próxima linha causa um erro de tipo # como join () só pode concatenar strs # print ('' .join (a))
No entanto, se você não é um fã de magia negra, você pode conseguir o mesmo efeito usando o loop for
.
3. Geradores
Para criar uma lista preenchida com itens idênticos, você pode usar a repetição da lista, por exemplo:
n = 5 a = [0] * n print(a)
Para criar listas mais complicadas, você pode usar geradores : as expressões que permitem preencher uma lista de acordo com uma fórmula. A forma geral de um gerador é a seguinte:
[expression for variable in sequence]
Onde variable
é o ID de alguma variável, sequence
é uma seqüência de valores, que leva a variável (isso pode ser uma lista, uma string ou um objeto obtido usando o range
função), expression
- alguma expressão, geralmente dependendo da variável usado no gerador. Os elementos da lista serão preenchidos de acordo com esta expressão.
Aqui estão alguns exemplos de pessoas usando geradores.
É assim que você cria uma lista de n
zeros usando o gerador:
a = [0 for i in range(5)] print(a)
Veja como você cria uma lista preenchida com quadrados de inteiros:
n = 5 a = [i ** 2 for i in range(n)] print(a)
Se você precisar preencher uma lista de quadrados de números de 1 n
, você pode alterar as configurações de range
para range(1, n + 1)
:
n = 5 a = [i ** 2 for i in range(1, n + 1)] print(a)
Veja como você pode obter uma lista cheia de números aleatórios de 1 a 9 (usando randrange
do módulo random
):
from random import randrange n = 10 a = [randrange(1, 10) for i in range(n)] print(a)
E neste exemplo, a lista consistirá de linhas lidas da entrada padrão: primeiro, você precisa inserir o número de elementos da lista (esse valor será usado como um argumento do range
funções), segundo - esse número de seqüências de caracteres:
a = [input() for i in range(int(input()))] print(a)
4. Fatias
Com listas e strings, você pode fazer fatias. Nomeadamente:
A[i:j]
fatia ji
elementos A[i]
, A[i+1]
, ..., A[j-1]
.
A[i:j:-1]
fatia ij
elementos A[i]
, A[i-1]
, ..., A[j+1]
(ou seja, alterando a ordem dos elementos).
A[i:j:k]
corta com o passo k
: A[i]
, A[i+k]
, A[i+2*k]
, .... Se o valor de k
<0, os elementos vêm na ordem oposta.
Cada um dos números i
ou j
pode estar faltando, o que significa "o início da linha" ou "o fim da linha"
As listas, diferentemente das strings, são objetos mutáveis : você pode atribuir um item de lista a um novo valor. Além disso, é possível alterar fatias inteiras. Por exemplo:
A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] print(A)
Aqui nós recebemos uma lista [1, 2, 3, 4, 5]
, e então tentamos substituir os dois elementos da fatia A[2:4]
com uma nova lista de três elementos. A lista resultante é a seguinte: [1, 2, 7, 8, 9, 5]
.
A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] print(A)
E aqui, a lista resultante será [40, 2, 30, 4, 20, 6, 10]
. A razão é que A[::-2]
é uma lista de elementos A[-1]
, A[-3]
, A[-5]
, A[-7]
e que os elementos são atribuídos a 10, 20, 30, 40, respectivamente.
Se uma fatia descontínua (ou seja, uma fatia com um passo k
, k > 1
) é atribuída a um novo valor, então o número de elementos nas fatias antiga e nova necessariamente coincidem, caso contrário, o erro ValueError
ocorre.
Note que A[i]
é um item de lista, não uma fatia!
5. Operações em listas
Você pode facilmente fazer muitas operações diferentes com listas.
x em A | Verifique se um item na lista. Retorna Verdadeiro ou Falso |
x não em A | O mesmo que não (x em A) |
min (A) | O menor elemento da lista |
max (A) | O maior elemento da lista |
A.index (x) | O índice da primeira ocorrência do elemento x na lista; na sua ausência gera uma exceção ValueError |
A.conta (x) | O número de ocorrências do elemento x na lista |