Eu...
Sou Igor Dutra Sobreira, 20, estudante de Sistemas para Internet no CEFET-PB, e desenvolvedor Python, Django.
Quando as condições estão boas e não tenho muito trabalho, estou velejando de Windsurf.
Recentes
- MySQL-python no Mac OS
- Properties no Python 2.6
- mod_wsgi no OSX
- Django 1.0!
- Promoção Efetividade.net / BR-Linux
- Auto-complete no Django
Categorias
- Pessoal
[4]
- Django
[7]
- Python
[6]
- Jython
[1]
- Eventos
[2]
- Java
[1]
- Gedit
[1]
- Linux
[2]
- PHP
[1]
- Gentoo
[1]
- Mac
[2]
- WSGI
[1]
- MySQL
[1]
Histórico
- Dezembro de 2008
- Agosto de 2008
- Julho de 2008
- Junho de 2008
- Maio de 2008
- Abril de 2008
- Março de 2008
- Fevereiro de 2008
- Janeiro de 2008
Comentários 
- Milton [ Envolva-se no mundo Django ]
- Henrique [ Construtores e Destrutores em Python e PHP 5 ]
- willem [ Django 1.0! ]
- Tiago Bastos [ Novo usuário Gentoo! ]
- Mayron Cachina [ Auto-complete no Django ]
Links
Conjuntos em Python - set e frozenset
- Publicado em: 20/01/2008 09:09h
Os conjuntos são um tipo de dados do python que nunca ouvi falar muito. Eu particularmente nunca usei, mas dando uma olhada agora vi que são muito interessantes.
Uma coisa que eu precisei fazer ontem foi retirar dados repedidos de uma lista, e não existe um método de lista que faça isso. Já nos conjuntos isso é automático, não existem dados repetidos.
A diferença entre set e frozenset, é que o primeiro é mutável, já o segunto não.
Criando um conjunto...
Veja que é passado um tipo iterável para o set(nessa caso uma string), onde cada elemento vai ser um elemento do conjunto.
Veja que realmente ele não permite elementos repetidos.
Você deve ter percebido que os elementos não estão na mesma ordem que foram passados. Isso porquê conjuntos realmente não possuem nenhuma ordem. São iteráveis, ou seja, podemos fazer "for x in meu_conjunto", "len(meu_conjunto)", "x in meu_conjunto". Mas como eles não possuem ordem, não é permitido indexação, nem slicing, algo tipo "meu_conjunto[2:]" está errado.
Mas vamos a algumas operações entre conjuntos.
Está contido e contém
Também podemos usar os operadores
União
Interseção
Diferença
Operações entre sets e frozensets são permitidas, mas veja que a ordem em que eles aparecem importa
Outra coisa importante, é que podemos passar iteráveis tanto na criação do set como nas operações usando os métodos. Mas as operações usando os operadores devem ser obrigatoriamente entre sets:
Os sets, por serem mutáveis, também possuem métodos que adicionar e remover novos elementos. Como os frozensets são imutáveis, não possuem esse métodos
O conjunto.update(outr_conjunto), atualiza "conjunto" adicionando os elementos de "outro_conjunto". Tem também os métodos set.add(x), set.remove(x), set.pop(), set.clear(). Além do set.discard(x), que só remove o elemento se ele existir, diferente do remove() que retorna KeyError caso o elemento não exista.
O exemplo que eu citei no começo, de retirar dados repetidos de uma lista poderia ter sido feito assim:
Simples não?
Veja mais detalhes sobre conjuntos aqui
Uma coisa que eu precisei fazer ontem foi retirar dados repedidos de uma lista, e não existe um método de lista que faça isso. Já nos conjuntos isso é automático, não existem dados repetidos.
A diferença entre set e frozenset, é que o primeiro é mutável, já o segunto não.
Criando um conjunto...
>>> conjunto1 = set('12345')
>>> conjunto1
set(['1', '3', '2', '5', '4'])
>>>
Veja que é passado um tipo iterável para o set(nessa caso uma string), onde cada elemento vai ser um elemento do conjunto.
>>> conjunto2 = set([4,4,7,7,8,9])
>>> conjunto2
set([8, 9, 4, 7])
Veja que realmente ele não permite elementos repetidos.
Você deve ter percebido que os elementos não estão na mesma ordem que foram passados. Isso porquê conjuntos realmente não possuem nenhuma ordem. São iteráveis, ou seja, podemos fazer "for x in meu_conjunto", "len(meu_conjunto)", "x in meu_conjunto". Mas como eles não possuem ordem, não é permitido indexação, nem slicing, algo tipo "meu_conjunto[2:]" está errado.
Mas vamos a algumas operações entre conjuntos.
Está contido e contém
>>> conjunto1.issubset(conjunto2)
False
>>> conjunto1.issubset(set('123456789'))
True
>>>
Também podemos usar os operadores
>>> conjunto1 <= set('123456789')
True
>>> set('123456789') >= conjunto1
True
União
>>> conjunto1.union(conjunto2)
set([4, 7, 8, 9, '1', '3', '2', '5', '4'])
>>> conjunto1 | conjunto2
set([4, 7, 8, 9, '1', '3', '2', '5', '4'])
Interseção
>>> set('123').intersection(set('345'))
set(['3'])
>>> set('123') & set('345')
set(['3'])
Diferença
>>> set('1234').difference(set('3'))
set(['1', '2', '4'])
>>>
>>> set('1234') - set('34')
set(['1', '2'])
>>>
Operações entre sets e frozensets são permitidas, mas veja que a ordem em que eles aparecem importa
>>> set('234') | frozenset('45')
set(['3', '2', '5', '4'])
>>> frozenset('23') | set('567')
frozenset(['3', '2', '5', '7', '6'])
Outra coisa importante, é que podemos passar iteráveis tanto na criação do set como nas operações usando os métodos. Mas as operações usando os operadores devem ser obrigatoriamente entre sets:
>>> set('234').union([5,6])
set(['3', '2', '4', 6, 5])
>>>
>>> set('234') | [2,3]
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for |: 'set' and 'list'
>>>
Os sets, por serem mutáveis, também possuem métodos que adicionar e remover novos elementos. Como os frozensets são imutáveis, não possuem esse métodos
>>> conjunto1 = set(['a','b','c','d'])
>>> conjunto1
set(['a', 'c', 'b', 'd'])
>>> conjunto1.update(set('nada'))
>>> conjunto1
set(['a', 'c', 'b', 'd', 'n'])
>>>
O conjunto.update(outr_conjunto), atualiza "conjunto" adicionando os elementos de "outro_conjunto". Tem também os métodos set.add(x), set.remove(x), set.pop(), set.clear(). Além do set.discard(x), que só remove o elemento se ele existir, diferente do remove() que retorna KeyError caso o elemento não exista.
O exemplo que eu citei no começo, de retirar dados repetidos de uma lista poderia ter sido feito assim:
>>> numeros = [2,5,3,2,1,6,3,5,2,2]
>>> list( set(numeros) )
[1, 2, 3, 5, 6]
Simples não?
Veja mais detalhes sobre conjuntos aqui
- Categorias: Python |
- Por: Igor Sobreira |
- 3 comentários
Comentários
Danilo Cabello
Muito interessante,
Em matérias que fiz na faculdade esses sets seriam de bom uso para auxiliar no estudo.
[]'s
- Adicionado em: 22/01/2008 07:51h
Elton Minetto [http://www.eltonminetto.net]
Ótimo artigo. Eu sou professor da disciplina de estrutura de dados e ensino essa parte de conjuntos. Se me permite vou usar seu artigo na disciplina.
Também já usei python para explicar este conteúdo. Até escrevi um post sobre isso no meu site:
http://www.eltonminetto.net/conjuntos-em-python.htm
t+
- Adicionado em: 25/01/2008 09:15h
EduardoWillians [http://pycappuccino.blogspot.com]
Cara ótimo artigo. Sabia das existências do "set" mas nunca havia usado. Muito bom. Parabéns!
- Adicionado em: 25/01/2008 11:17h
