Jump to content
Sign in to follow this  
pythonshell

Listas de Listas em Python

Recommended Posts

pythonshell

Boas,

sou um novo utilizador, não só desse site mas também da linguagem Python, daí que esteja com umas certas dúvidas.

Visto ter algumas bases noutras linguagens de programação estou com duvidas de como aceder a listas e altera-las assim como a sua sintaxe. Passo a citar:

Tenho 1 lista a = ['spam', 'eggs', 100, 1234] se fizer a[-2] obtenho 100, quando faço a[1:-1] obtenho ['eggs', 100], não deveria obter a mesma coisa ou seja ['eggs', eggs]? E porque quando faço a[:2] + ['bacon', 2*2] obtenho ['spam', 'eggs', 'bacon', 4]?

Já agora como faço para obter ajuda na sintaxe do código ex: [:] o que quer dizer ou saber mais sobre palavras chaves do python (copy, type, sort, index etc etc, não acho tutoriais sobre isso).

Obrigada pela atenção.

Share this post


Link to post
Share on other sites
JoaoRodrigues

Hello ;)

Quanto à tua dúvida de tutoriais, o site que o pmg te deu é de facto muito informativo :)

Relativamente às listas:

lista = ['spam', 'eggs', bacon']

Em Python as listas começam no índice 0 e índices negativos significa ler de trás para a frente. Ou seja, se fizeres lista[-1] vai-te dar o último elemento da lista.

Quanto às outras operações que estás a tentar fazer, chamam-se slicing. Há um bom tutorial disso na wiki: http://wiki.portugal-a-programar.pt/dev_geral:python:slicing

Basicamente, quanto fazes lista[0:2] estás a cortar a lista até ao objecto de índice 2, daí, que ele não apareça. Se fizeres lista[0:-1], é a mesma coisa: ficas com a lista cortada até ao objecto de índice -1, o último, daí que ele não apareça. No teu exemplo tens:

a = ['spam', 'eggs', 100, 1234]

O índice -1 é o elemento 1234. Assim, de 1 a -1, ficas com o elemento de índice 1, eggs, até ao de índice -1, exclusive, ou seja: ['eggs', 100].

A sintaxe [x:y] é basicamente o mesmo que dizeres "de x a y". Se omitires um deles, por exemplo, [:y] fica "até y", ou seja, do início, até y. O mesmo se passa com o "x:",  partir de x.

Quando fazes a[:2] + ['bacon', 2*2] estás a juntar à lista 'a', o segmento ['bacon', 2*2']. Mas, como estás a dizer a[:2], estás a usar apenas a parte da lista 'a' a até ao elemento de índice 2. Ficas portanto com uma nova lista com os dois primeiros elementos de 'a', ['spam', 'eggs'], e com os elementos que acrescentaste à mão, 'bacon' e o resultado da operação 2*2, 4.

Espero que tenhas entendido :x

Share this post


Link to post
Share on other sites
djthyrax

Lê este tutorial de slicing: http://wiki.portugal-a-programar.pt/dev_geral:python:slicing

Em especial, lê a resalva do rolando2424. Quando tu dizes a[3:4], tu vais buscar tudo o que esteja entre o inicio da posição 3 e o início da posição 4, ou seja, apenas o que está na posição 3. Tanto que se tiveres a = [1, 2, 3, 4, 5] e fizeres a[:2] ou a[0:2] ou a[0:2:1], ele vai-te retornar [1, 2] ([a[0], a[1]]).

Uma função que replica o funcionamento do slicing, pode ser que te ajude a perceber:

def slicing(what, frm = 0, to = None, step = 1):
    if what in [type(1), type(1.0)]: #isto serve só para despistar os objectos não iteráveis
        raise TypeError, "'int' or 'float' object is unsubscriptable" #fiz batota aqui 
    if to == None: to = len(what) #default do to
    returns = [] #o que vai ser retornado
    for x in range(frm, to, step): #se não estás familiarizado com o range(x, y, z), ele retorna uma lista de x até y-1, sendo que em cada iteração é somado z ao x (o default do x é 0, o default do z é 1).
        returns.append(what[x]) 
    if type(what) == type("string"): #este if e o primeiro elif são só para o caso de serem passadas strings ou tuplas, o que não te interessa agora
        return ''.join(returns)
    elif type(what) == type((1, 2, 3)):
        return tuple(returns)
    else:
        return returns

Exemplos:

>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> a[3:7:2]
[4, 6]
>>> slicing(a, 3, 7, 2)
[4, 6]
>>> a[::]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> slicing(a)
[1, 2, 3, 4, 5, 6, 7, 8]
>>> a[:2]
[1, 2]
>>> slicing(a, to = 2)
[1, 2]
>>> slicing(a, 0, 2)
[1, 2]
>>> 


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.