Uma list é uma coleção mutável de itens em sequência.
Como a maioria das coleções (veja os tipos embutidos tuple, dict e set), as listas podem guardar referência a qualquer tipo de dado (ou a vários), incluindo outras listas.
Como em qualquer sequência, os itens podem ser acessados por um 0-based index a partir da esquerda e por um -1-based index a partir da direita.
As listas podem ser copiadas por inteiro ou em parte usando notação de fatia ou <list>.copy().
As listas dão suporte tanto a operações comuns de sequência quanto a operações mutáveis de sequência, como min()/max(), <list>.index(), <list>.append() e <list>.reverse().
Os elementos da lista podem ser iterados com a construção for item in <list>.
for index, item in enumerate(<list>) pode ser usado quando tanto o índice quanto o valor do elemento são necessários.
Por baixo dos panos, as lists são implementadas como arrays dinâmicos, semelhantes ao tipo ArrayList do Java, e costumam ser usadas para armazenar grupos de dados semelhantes (strings, números, conjuntos etc.) de comprimento desconhecido.
As listas são uma estrutura de dados extremamente flexível e útil, e muitos métodos e operações embutidos do Python produzem listas como resultado.
Uma list pode ser declarada como um literal com colchetes [] e vírgulas entre os elementos:
>>> no_elements = []
>>> no_elements
[]
>>> one_element = ["Guava"]
>>> one_element
['Guava']
>>> elements_separated_with_commas = ["Parrot", "Bird", 334782]
>>> elements_separated_with_commas
['Parrot', 'Bird', 334782]
Para facilitar a leitura, quebras de linha podem ser usadas quando há muitos elementos ou estruturas de dados aninhadas dentro de uma list:
>>> lots_of_entries = [
"Rose",
"Sunflower",
"Poppy",
"Pansy",
"Tulip",
"Fuchsia",
"Cyclamen",
"Lavender"
]
>>> lots_of_entries
['Rose', 'Sunflower', 'Poppy', 'Pansy', 'Tulip', 'Fuchsia', 'Cyclamen', 'Lavender']
# Each data structure is on its own line to help clarify what they are.
>>> nested_data_structures = [
{"fish": "gold", "monkey": "brown", "parrot": "grey"},
("fish", "mammal", "bird"),
['water', 'jungle', 'sky']
]
>>> nested_data_structures
[{'fish': 'gold', 'monkey': 'brown', 'parrot': 'grey'}, ('fish', 'mammal', 'bird'), ['water', 'jungle', 'sky']]
O construtor list() pode ser usado vazio ou com um iterável como argumento.
O construtor percorre os elementos do iterável e os adiciona à list em ordem:
>>> no_elements = list()
>>> no_elements
[]
# The tuple is unpacked and each element is added.
>>> multiple_elements_from_tuple = list(("Parrot", "Bird", 334782))
>>> multiple_elements_from_tuple
['Parrot', 'Bird', 334782]
# The set is unpacked and each element is added.
>>> multiple_elements_from_set = list({2, 3, 5, 7, 11})
>>> multiple_elements_from_set
[2, 3, 5, 7, 11]
Os resultados ao usar o construtor list com uma string ou um dict podem ser surpreendentes:
# String elements (Unicode code points) are iterated through and added *individually*.
>>> multiple_elements_string = list("Timbuktu")
>>> multiple_elements_string
['T', 'i', 'm', 'b', 'u', 'k', 't', 'u']
# Unicode separators and positioning code points are also added *individually*.
>>> multiple_code_points_string = list('अभ्यास')
>>> multiple_code_points_string
['अ', 'भ', '्', 'य', 'ा', 'स']
# The iteration default for dictionaries is over the keys, so only key data is inserted into the list.
>>> source_data = {"fish": "gold", "monkey": "brown"}
>>> multiple_elements_dict_1 = list(source_data)
['fish', 'monkey']
Como o construtor list só aceita iteráveis (ou nada) como argumentos, objetos que não são iteráveis geram um erro de tipo.
Por isso, é bem mais fácil criar uma list com um único item usando o método literal.
# Numbers are not iterable, and so attempting to create a list with a number passed to the constructor fails.
>>> one_element = list(16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
# Tuples *are* iterable, so passing a one-element tuple to the constructor does work, but it's awkward
>>> one_element_from_iterable = list((16,))
>>> one_element_from_iterable
[16]
Os itens dentro das listas (assim como os itens em outros tipos de sequência, str e tuple) podem ser acessados por meio de 0-based index e notação de colchetes.
Os índices podem ir da left --> right (começando em zero) ou da right --> left (começando em -1).
| índice da esquerda ⟹ |
|
⟸ índice da direita |
>>> breakfast_foods = ["Oatmeal", "Fruit Salad", "Eggs", "Toast"]
# Oatmeal is at index 0 or index -4.
>>> breakfast_foods[0]
'Oatmeal'
>>> breakfast_foods[-4]
'Oatmeal'
# Eggs are at index -2 or 2
>>> breakfast_foods[-2]
'Eggs'
>>> breakfast_foods[2]
'Eggs'
# Toast is at -1
>>> breakfast_foods[-1]
'Toast'
Uma seção dos elementos dentro de uma list pode ser acessada por meio da notação de fatia (<list>[start:stop]).
Uma fatia é definida como uma sequência de elementos na posição index, tal que start <= index < stop.
O fatiamento retorna uma cópia dos itens "fatiados" e não modifica a list original.
Um parâmetro step também pode ser usado, [start:stop:step], para "pular" ou filtrar os elementos da list (por exemplo, um step de 2 seleciona um elemento sim, outro não, dentro do intervalo):
>>> colors = ["Red", "Purple", "Green", "Yellow", "Orange", "Pink", "Blue", "Grey"]
# If there is no step parameter, the step is assumed to be 1.
>>> middle_colors = colors[2:6]
>>> middle_colors
['Green', 'Yellow', 'Orange', 'Pink']
# If the start or stop parameters are omitted, the slice will
# start at index zero, and will stop at the end of the list.
>>> primary_colors = colors[::3]
>>> primary_colors
['Red', 'Yellow', 'Blue']
Usar a função embutida sum() em uma lista retorna a soma de todos os números da lista:
>>> number_list = [1, 2, 3, 4]
>>> sum(number_list)
10
Você também pode obter o comprimento de uma lista usando a função len():
>>> long_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
>>> len(long_list)
10
As listas também podem ser combinadas de várias maneiras:
# Using the plus + operator unpacks each list and creates a new list, but it is not efficient.
>>> new_via_concatenate = ["George", 5] + ["cat", "Tabby"]
>>> new_via_concatenate
['George', 5, 'cat', 'Tabby']
# Likewise, using the multiplication operator * is the equivalent of using + n times.
>>> first_group = ["cat", "dog", "elephant"]
>>> multiplied_group = first_group * 3
>>> multiplied_group
['cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant']
As listas fornecem um iterador e podem ser percorridas em laços da mesma forma que outros tipos de sequência.
# Looping through the list and printing out each element.
>>> colors = ["Orange", "Green", "Grey", "Blue"]
>>> for item in colors:
... print(item)
...
Orange
Green
Grey
Blue
Para uma explicação mais detalhada sobre loops e iterators, complete o conceito loops.
Elyse está muito ansiosa para jogar um pouco de pôquer (e outros jogos de cartas) durante a viagem que vai fazer para Vegas. Como é uma grande fã de "automonitoramento", ela quer montar algumas funções pequenas que vão ajudá-la com tarefas de acompanhamento e pediu sua ajuda para pensar nelas.
Elyse gosta especialmente de pôquer e quer acompanhar quantas rodadas ela joga, e quais rodadas são essas. Cada rodada tem seu próprio número, e cada mesa mostra o número da rodada sendo jogada no momento. Elyse escolhe uma mesa e se senta para jogar sua primeira rodada. Ela planeja jogar três rodadas.
Implemente uma função get_rounds(<round_number>) que recebe o número da rodada atual e retorna uma única list com essa rodada e as duas próximas que virão:
>>> get_rounds(27)
[27, 28, 29]
Elyse jogou algumas rodadas na primeira mesa, depois deu uma pausa e jogou mais algumas rodadas em uma segunda mesa ... mas acabou com uma lista diferente para cada mesa! Ela quer juntar as duas listas para poder acompanhar todas as rodadas de pôquer no mesmo lugar.
Implemente uma função concatenate_rounds(<rounds_1>, <rounds_2>) que recebe duas listas e retorna uma única list formada por todas as rodadas da primeira list, seguidas de todas as rodadas da segunda list:
>>> concatenate_rounds([27, 28, 29], [35, 36])
[27, 28, 29, 35, 36]
Falando sobre algumas rodadas anteriores de pôquer, outro jogador comenta como duas delas se desenrolaram de forma parecida. Elyse não tem certeza se jogou aquelas rodadas ou não.
Implemente uma função list_contains_round(<rounds>, <round_number>) que recebe dois argumentos, uma lista de rodadas jogadas e um número de rodada.
A função retornará True se a rodada estiver na lista de rodadas jogadas, e False se não estiver:
>>> list_contains_round([27, 28, 29, 35, 36], 29)
True
>>> list_contains_round([27, 28, 29, 35, 36], 30)
False
Elyse quer experimentar um jogo novo chamado Black Joe. Ele é parecido com o Black Jack, em que seu objetivo é fazer as cartas na sua mão somarem um valor alvo, mas no Black Joe o objetivo é fazer a média dos valores das cartas ser 7. A média pode ser encontrada somando todos os valores das cartas e depois dividindo essa soma pelo número de cartas na mão.
Implemente uma função card_average(<hand>) que retornará o valor médio de uma mão de Black Joe.
>>> card_average([5, 6, 7])
6.0
No Black Joe, velocidade é importante. Elyse vai tentar encontrar uma forma mais rápida de calcular a média.
Ela pensou em duas formas de obter um número parecido com a média:
Implemente a função approx_average_is_average(<hand>), considerando hand, uma lista com os valores das cartas na sua mão.
Retorne True se uma or ambas das estratégias citadas acima resultarem em um número igual à média real.
Observação: O comprimento de todas as mãos é ímpar, para facilitar encontrar a mediana.
>>> approx_average_is_average([1, 2, 3])
True
>>> approx_average_is_average([2, 3, 4, 8, 8])
True
>>> approx_average_is_average([1, 2, 3, 5, 9])
False
Intrigada com os resultados do seu experimento de médias, Elyse se pergunta se tirar a média das cartas nas posições pares e a média das cartas nas posições ímpares daria os mesmos resultados. Hora de mais uma função de teste!
Implemente uma função average_even_is_average_odd(<hand>) que retorna um Boolean indicando se a média das cartas nos índices pares é a mesma das cartas nos índices ímpares.
>>> average_even_is_average_odd([1, 2, 3])
True
>>> average_even_is_average_odd([1, 2, 3, 4])
False
Cada 11ª mão no Black Joe é uma mão bônus com uma regra bônus: se a última carta que você compra for um Valete, você dobra o valor dela.
Implemente uma função maybe_double_last(<hand>) que recebe uma mão e verifica se a última carta é um Valete (11).
Se a última carta for um Valete (11), dobre o valor dela antes de retornar a mão.
>>> hand = [5, 9, 11]
>>> maybe_double_last(hand)
[5, 9, 22]
>>> hand = [5, 9, 10]
>>> maybe_double_last(hand)
[5, 9, 10]
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.