(NÃO Resolvido)Como verificar se uma list tem determinado valor?

Iniciado por Azuos, 14 de Maio de 2010, 13:52

tópico anterior - próximo tópico

Azuos

Bom, estou escrevendo um pequeno robô que conversa com você em python, que depois de estar num estágio mais avançado de desenvolvimento planejo abrir o código e colocar no source forge.net... Mas enfim, o programa captura um raw_input do usuário, remove a pontuação e separa cada uma das palavras transformando a variável numa list.

Já achei métodos de verificar se o valor numa ordem específica numa lista, mas eu queria um jeito de verificar se algum dos valores da lista é correspondente a alguma coisa. Por exemplo, eu quero descobrir se algum dos valores da list (qualquer um) é igual a "oi".

Meu código está assim:
#! usr/bin/python
# -*- encoding: utf-8 -*-
fala = raw_input("Diga algo:") #Pede que o usuário diga algo que será armazenado na variável "fala"
fala = fala.replace(".", " ") #Troca o caractere "." por um espaço
fala = fala.replace("?", " ") #Troca o caractere "?" por um espaço
fala = fala.replace("!", " ") #Troca o caractere "!" por um espaço
fala = fala.replace(",", " ") #Troca o caractere "," por um espaço
fala.split(" ") #Transforma a string "fala" em uma list separando as palavras


Eu já tentei isso:
if 'oi' in fala
Mas com esse jeito, se algum dos valores for algo como "depois", ele vai dizer que é igual a oi.

Alguém sabe um método pra fazer isso?




irtigor

Faz tempo que não vejo python (saudade boa), vê se não é alguma coisa assim que você quer:

import re

str = raw_input('Fala:').lower()

if re.match('qqrcoisa', str):
      blablabla

-----------
Da documentação do python

re.match("c", "abcdef")  # No match
re.search("c", "abcdef") # Match
<_sre.SRE_Match object at ...>

Azuos

Não é exatamente isso. O match só acha o "oi" se esta for a primeira palavra, enquanto o search continua achando o depois.

E esse método procura na string, eu quero procurar numa lista.

Uma lista tem vários valores, não é? Por exemplo:
Lista 1
lista = ['a', 'b', 'c']
Lista 2
lista = ['d', 'e', 'f']

Eu quero um método pra verificar se algum dos valores da lista é igual a c em uma condição, na lista 1 do meu exemplo a condição seria verdadeira e na 2 falsa. Será que deu pra entender? Acho que não sou muito bom pra explicar.

irtigor

É eu não devo estar compreendendo mesmo... já que o que eu intendi dá para perfeitamente usar o meu exemplo.


import re

lista = ['Hoje', 'está', 'ensolarado']

for palavra in lista:
    if re.match(palavra,'ensolarado'):
        .
        .
        .



Azuos

O seu exemplo funciona, mas ele tem um mesmo problema do outro: ele reconhece uma sequência de letras mesmo que o valor não seja isso. No exemplo que eu dei, quero verificar se existe a palavra "oi" em algum valor, se tiver um valor com a palavra depois, ele diz que sim, existe um valor com a palavra oi. Mas você ajudou muito.

irtigor

#5
Você está usando de forma errada, mostrei um único exemplo. O do uso do re.match. E ele vai diferenciar tudo. Testa no interpretador:

Usando de base o seu exemplo(cópia do interpretador):


Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.match('oi','depois')
>>> re.match('depois','oi')
>>> re.match('oi','depOIs')
>>> re.match('DEPoiS','oi')
>>> re.match('oi','oi')
<_sre.SRE_Match object at 0xb73e9db0>
>>> re.match('depois','depois')
<_sre.SRE_Match object at 0x94c7250>
>>>


Viu, só foi verdadeiro quando era realmente igual. Ele só não diferencia espaços depois da palavra, então 'oi' e 'oi ' são iguais.

Azuos

Achei que tinha dado certo, mas ele só dá verdadeiro se for o primeiro valor, caso o contrário ele não acha =P Tava dando uns erros fui ver na documentação do python e olha só:

Citação de: Documentação do Pythonmatch checks for a match only at the beginning of the string

Imoogi

cara! acho q vc ta fazendo errado
olha só


import re

lista = ['depois', 'dois', 'pois', 'oi', 'arroiz']

for n in lista:
     if re.match(n, 'oi'):
           print 'sim'

só vai imprimir uma vez 'sim', pq só existe um 'oi', no lugar do print sim vc coloca o codigo q vc quer rodar
funciona direitinho, sem misterio

fpissarra

#8
Citação de: Imoogi online 15 de Maio de 2010, 16:31
cara! acho q vc ta fazendo errado
olha só


import re

lista = ['depois', 'dois', 'pois', 'oi', 'arroiz']

for n in lista:
    if re.match(n, 'oi'):
          print 'sim'

só vai imprimir uma vez 'sim', pq só existe um 'oi', no lugar do print sim vc coloca o codigo q vc quer rodar
funciona direitinho, sem misterio

Se não der certo: Sendo o critério uma regular expression, não poderia usar "^oi$"?

http://docs.python.org/library/re.html

Outra coisa... não é mais fácil usar:

try:
  n = lista.index('oi')
except:
  n = -1


[]s

José Vitor

Hummm, eu não conheço Python (na verdade, eu não gosto de Python), mas como esse negócio está se arrastando resolvi me intrometer:


#!/usr/bin/python

lista = ['depois', 'dois', 'pois', 'oi', 'arroiz']

if 'oi' in lista:
   print 'yes'
else:
   print 'no'


O operador in é usado para verificar se uma expressão faz parte de uma lista...não seria isto que vocês estão querendo ?