In [1]:
minhalista = "Como fazer uma list comprehension".split()
Observe que na linha acima aplicamos o método split diretamente a uma string, sem precisarmos nomear uma variável com o conteúdo da string!
In [2]:
minhalista
Out[2]:
Como transformar todas as primeiras letras de cada item da lista em maiúsculas?
In [3]:
minhalista = [x.capitalize() for x in minhalista]
In [4]:
minhalista
Out[4]:
Observe que x é uma variável local à list comprehension; ela serve apenas para que possamos fazer referência a cada item da lista sendo percorrida na nova expressão que queremos gerar. Fora da list comprehension, o Python não sabe quem é esse x:
In [6]:
x
In [7]:
linguadope = ["Pe"+palavra for palavra in minhalista]
In [8]:
linguadope
Out[8]:
Para transformarmos essa lista em uma string, podemos usar o método join:
In [9]:
" ".join(linguadope)
Out[9]:
Uma explicação para a sintaxe do join: http://www.faqs.org/docs/diveintopython/odbchelper_join.html (basicamente, o método join precisa de duas strings: um resultado e uma "cola". Mas o argumento a ser unido pode ser outra coisa além de uma string (notadamente, iterables)
É comum querermos gerar uma lista de números delimitada por dois valores. A função range(a,b) gera uma lista que vai do número a até b-1; porém, o resultado da função range não é a lista diretamente, mas uma estrutura de dados que precisamos transformar em uma lista.
In [15]:
numeros = [n for n in range(0,10)]
print(numeros)
Podemos, usando list comprehensions, gerar outras listas. Por exemplo, gerar uma lista de números ímpares:
In [16]:
numeros = [2*n+1 for n in range(0,11)]
In [17]:
numeros
Out[17]:
In [18]:
numeros[0]
Out[18]:
In [19]:
numeros[-1]
Out[19]:
In [20]:
numeros[3:4]
Out[20]:
Observe que, com um parâmetro a mais, podemos selecionar os elementos da lista de 2 em 2:
In [21]:
numeros[0:11:2]
Out[21]:
Também podemos calcular o tamanho de uma lista de números:
In [22]:
len(numeros)
Out[22]:
In [23]:
numeros[-3]
Out[23]:
Podemos gerar uma nova lista contendo pedaços da lista original:
In [24]:
numeros = [numeros[4:6],numeros[3:8]]
print(numeros)
Infelizmente, o resultado acima é uma lista de listas: cada elemento da lista é, por sua vez, uma outra lista:
In [25]:
numeros[0]
Out[25]:
Assim, para acessarmos um elemento individual da lista numeros, precisamos utilizar um índice para a lista externa, e outro índice para a lista interna:
In [26]:
numeros[0][1]
Out[26]:
Para transformarmos aquela lista de listas em uma lista simples, podemos usar o comando abaixo (admito que é um pouco mágico, mas funciona! ;))
In [27]:
lista = [item for sublist in numeros for item in sublist]
lista
Out[27]:
Observe que o slicing também vale para sequências de caracteres (strings):
In [28]:
palavra = "teste"
In [29]:
palavra[1:]
Out[29]:
De fato, uma lista comprehension inclui um comando de repetição: executamos alguma ação com cada item de uma lista; se lermos a expressão da lista comprehension, poderíamos dizer: "retorne n para cada n no conjunto que vai de 0 a 10":
In [32]:
numeros = [n for n in range(0,11)]
print(numeros)
Fazemos isso explicitamente quando usamos a estrutura for. Observe que, no Python, não precisamos sinalizar o fim de um bloco de código; na verdade, a indentação sinaliza um bloco. Observe a diferença entre as células abaixo:
In [35]:
for item in numeros: # Indentação
print("Numero "+str(item))
print("bla")
In [36]:
for item in numeros: # Indentação
print("Numero "+str(item))
print("bla")
In [37]:
palavra = "bla"
if palavra == "bla!":
print("Verdadeiro")
else:
print("Falso")
Usamos == na expressão acima, pois no Python é necessário diferenciar entre um comando de atribuição (atribuir um valor a uma variável) e um comando de comparação (testar se duas variáveis são iguais). O caso do if é o segundo.
Podemos também acrescentar outras condições lógicas ao nosso teste.
In [38]:
if palavra == "bla!" and 3 > 2:
print("Aha")
else:
print("Uhu")
In [47]:
if palavra == "bla!" or 3>2:
print("Aha")
else:
print("Uhu")
Para acessarmos comandos e operações realizadas no nível do sistema operacional, utilizamos o módulo os.
In [2]:
import os
Atenção: Escolha um diretório no seu computador para executar esse exemplo, com arquivos que possam ser renomeados.
No meu caso, usarei os arquivos do diretório oceanobiopython/exemplos/exemplo_1
In [24]:
diretorio = os.path.join(os.getcwd(), "..","exemplos/exemplo_1")
Em seguida, vamos listar todos os arquivos deste diretório.
In [10]:
os.listdir(diretorio)
Out[10]:
Para que possamos percorrer a lista que contém os nomes de todos os arquivos deste diretório, vamos salvar esta lista de nomes de arquivo:
In [11]:
lista = os.listdir(diretorio)
Agora, vamos efetuar a seguinte operação: todos os arquivos deste diretório que tiverem a extensão ".txt" terão um novo nome iniciando com letra maiúscula.
In [12]:
for arquivo in lista:
if arquivo[-3:] == "txt":
os.rename(os.path.join(diretorio,arquivo),os.path.join(diretorio,arquivo.capitalize()))
Verificando que funcionou:
In [13]:
os.listdir(diretorio)
Out[13]:
(é claro que se você estiver em um diretório em que não hajam arquivos com extensão ".txt", nada irá acontecer!)
Para desfazermos este exemplo, podemos executar o seguinte script:
In [15]:
lista = os.listdir(diretorio)
for arquivo in lista:
os.rename(os.path.join(diretorio,arquivo),os.path.join(diretorio,arquivo.lower()))
In [16]:
os.listdir(diretorio)
Out[16]:
In [17]:
import os
diretorio = os.path.join(os.getcwd(), "..","exemplos/exemplo_2")
print(diretorio)
print(os.listdir(diretorio))
Agora, para descobrirmos quando o arquivo foi modificado pela última vez, precisamos usar uma função que não retorna a data da última modificação no formato em que estamos acostumados. Ela retorna o tempo, em segundos, decorrido desde 1o de janeiro de 1970 (se você estiver no Unix). Para podermos obter o que queremos, usamos então a função ctime do módulo time.
In [18]:
import time
print(os.path.getmtime(os.path.join(diretorio,"file1.txt")))
time.ctime(os.path.getmtime(os.path.join(diretorio,"file1.txt")))
Out[18]:
In [19]:
lista = os.listdir(diretorio)
for arquivo in lista:
print(time.ctime(os.path.getmtime(os.path.join(diretorio,arquivo))))
In [20]:
os.mkdir(os.path.join(diretorio,"arquivos_setembro"))
os.mkdir(os.path.join(diretorio,"arquivos_agosto"))
In [21]:
for arquivo in lista:
if arquivo != "teste.txt":
data_modificacao = time.ctime(os.path.getmtime(os.path.join(diretorio,arquivo)))
if data_modificacao[4:7] == "Sep":
os.rename(os.path.join(diretorio,arquivo), os.path.join(diretorio,"arquivos_setembro",arquivo))
elif data_modificacao[4:7] == "Aug":
os.rename(os.path.join(diretorio,arquivo), os.path.join(diretorio,"arquivos_agosto",arquivo))
Agora, vamos desfazer o exercício para restaurarmos o diretório à estrutura original:
In [22]:
lista = os.listdir(diretorio)
for item in lista:
if os.path.isdir(os.path.join(diretorio,item)):
locais = os.listdir(os.path.join(diretorio,item))
print(locais)
for arquivo in locais:
os.rename(os.path.join(diretorio,item,arquivo),os.path.join(diretorio,arquivo))
os.rmdir(os.path.join(diretorio,item))
In [23]:
print(os.listdir(diretorio))
(Fim da Aula 2, ministrada em 15/09/2016)